java反射

反射类

反射构造方法:
Class clazz = Class.forName("类的路径(包名+类名)");
Constructor c = clazz.getConstructor(arg0);//里面这个参数是确定你要调用哪个方法的;这个参数是可变参数。
A a = (A)c.newInstance(null);//构造方法是空的
如果构造方法不是空的,则需要传什么参数就传什么参数进去调用就好了。

反射私有构造方法:

Class clazz = Class.forName("类的路径(包名+类名)");
Constructor c = clazz.getDeclaredConstructor();//反射私有的构造方法
c.setAccessible(true);//暴力反射,就是强制反射(私有方法需要特殊处理)
A a = (A)c.newInstance();

反射普通方法:

Class clazz = Class.forName("类的路径(包名+类名)");
Method method = clazz.getMethod("方法名",arg0);//这里的第二个参数又是对应方法的参数,传同样的参数则会反射对应的方法。
method.invoke(对象,参数);//这里的对象是指要调用谁的方法。参数对应的是相应方法的参数;
私有的方法要暴力反射!
Method method = clazz.getDeclaredMethod()

要使用私有方法必需要设置:method.setAccessible(true);
如果是静态方法,则invoke(对象,参数)方法里面的对象传null进去即可

反射main方法

Class clazz = Class.forName("类的路径(包名+类名)");
Method method = clazz.getMethod("main",arg0);//反射主方法
method.invoke(null,参数);
method.invoke(null,new Object[]{new Object[]{"aa","bb"}});

main方法比较特殊,这是由于sun公司在升级jdk(1.4升到1.5)时候引起的一个漏洞,1.4默认会把数组拆掉变成多个参数去对应方法,而1.5要兼容1.4,则它也会去拆,如果仅仅使用,
method.invoke(null,new Object[]{“aa”,”bb”});这样去调用main方法,则jdk默认会把数组拆掉变成两个String,”aa”和”bb”,则它会去找有两个String参数的main方法!然而,我们的main方法参数却是这个(String[] argo),是一个字符数组,所以找不到该main方法,故而我们必须给个数组再包一个数组,jdk把这个数组拆掉后,里面就正好再是一个数组。正好对应main方法。
method.invoke(null,(Object)new Object[]{“aa”,”bb”}});这样也可以,欺骗过了jdk


java反射数组参数的方法:
参考:利用Java反射机制调用含数组参数的方法

利用java反射机制调用一个本身含有数组参数的方法需要一点点技巧。下面的代码展示了怎么样正确地和错误地使用java反射机制调用这样的方法。
–一个含有这种方法的Java类–

public class Dao {

public void Method2(String[] params){

//do something

}

}
正确的方法:
public class Test {

public static void main(String[] args) throws Exception{
Class classToCall = Class.forName(“Dao”);
String[] argu ={“1″,”2″};
Method methodToExecute = classToCall.getDeclaredMethod(“Method2″, new Class[]{String[].class});
methodToExecute.invoke(classToCall.newInstance(), new Object[]{argu});

}

}
错误的方法,会得到异常:
java.lang.IllegalArgumentException: wrong number of arguments—

public class Test {

public static void main(String[] args) throws Exception{
Class classToCall = Class.forName(“Dao”);
String[] argu ={“1″,”2″};
Method methodToExecute = classToCall.getDeclaredMethod(“Method2″, new Class[]{String[].class});
methodToExecute.invoke(classToCall.newInstance(), argu);

}

}

原因:invoke方法的第二个参数接受的是Object数组,并把数组的每一个元素作为方法的一个参数。所以如果某一个参数为数组,要在外面用new Object[]{}包起来:

Open DeclarationObject java.lang.reflect.Method.invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值