如何获取java类里的私有方法

如何获取java类里的私有方法,第1张

利用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"、如何用反射读取私有属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/10154457.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存