
利用java的反射机制,以下代码:
public class Main {private void fun(){
Systemoutprintln("this is my private method!");
}
private void fun2(String what) {
Systemoutprintln(what);
}
private static void fun3(){
Systemoutprintln("this is my private static method!");
}
}import javalangreflectInvocationTargetException;
import javalangreflectMethod;
public class Test {
public static void main(String[] args) {
try {
Class<> _class = ClassforName("Main");//名字填完整的包名类名 ,示例没有包因此只填类名
Object object = _classnewInstance();
Method method = _classgetDeclaredMethod("fun");//fun无参数,因此只要方法名
methodsetAccessible(true);//私有方法设置可访问
methodinvoke(object, new Object[0]);
Method method2 = _classgetDeclaredMethod("fun2",Stringclass);//有参数,需要参数的类别
method2setAccessible(true);
method2invoke(object, new String("test"));//传参数的值
Method method3 = _classgetDeclaredMethod("fun3");
method3setAccessible(true);
method3invoke(object,new Object[0]);//静态方法,object传null
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
catch (InstantiationException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
Class clazz = loaderloadClass("combaobaotaoreflectPrivateCar");
PrivateCar pcar = (PrivateCar)clazznewInstance(); // package comtestspringreflect;
虽然类名相同,但包名不同,不是同一个类,所以不能转换。
Java中只有类的和包名完全相同,才是同一个类。
改为:
combaobaotaoreflectPrivateCar pcar = (combaobaotaoreflectPrivateCar)clazznewInstance();
或者
Class clazz = loaderloadClass("comtestspringreflectPrivateCar");
设置
A a = new A();
Field field = agetClass()getDeclaredField("x");
fieldsetAccessible(true);
fieldset(a, 1);
读取
Field f = agetClass()getDeclaredField("x");
fsetAccessible(true);
Systemoutprintln(fget(a));
如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!
vaela
我的类中有一组私有方法,我现在想根据灵活的输入值来动态调用其中的私有方法,代码类似是这个样子。
代码跑起来后,我发现 dynMethod 并没有返回结果,请问我该如何配置才能正确的返回?
如果你真的想解决这个问题,个人建议你写个扩展方法,比如下面这样。
然后可以这样使用
微软最近修改了 反射API ,在新的反射模式和平台下,大概是这么写的。
实践中最好还是封装成一个 泛型方法 ,比如下面这样。
注意:
确实微软已经优化了各种 反射Api ,使用起来虽然较慢,但相比以前要好很多了。
类ClassA有私有类InnerClass01和InnerClass02;
Class[] mClass = mClassAgetdeclareclass();
ClassAInnerClass01 mInner01;
ClassAInnerClass02 mInner02;
for (int i = 0; i < mClasslength; i ++) {
String strClassName = mClass[i]getSimpleName();
if (strClassNameeq("InnerClass01")) {
mInner01 = (ClassAInnerClass01 ) mClass[i]newInstance();
}
if (strClassNameeq("InnerClass02")) {
mInner01 = (ClassAInnerClass02 ) mClass[i]newInstance();
}
这两私有类就可以用了
}
java中有安全机制,对于管理私有方法(属性)的反射问题涉及到了这方面
我记得java中有个类还是配置叫SecurityManager,通过对jvm的配置来启用安全策略,然后在反射时进行权限检查
以上就是关于如何获取java类里的私有方法全部的内容,包括:如何获取java类里的私有方法、反射机制访问私有方法代码异常"java.lang.ClassCastException"、如何用反射读取私有属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)