上一篇博客中,大致了解了整个反射的机制。
这次主要是就反射的某些方法进行测试,以便更好的理解反射:
1.首相建立普通类:该类包括一些私有的方法和属性。
public class Tank {
private int x = 4;
public int y = 5;
public Tank(int x, int y) {
super();
this.x = x;
this.y = y;
}
public Tank(){
}
public int add(){
return 4;
}
private void bdd(){
System.out.println("私有方法步能访问哦 亲!!");
}
private void cdd(int x,int y){
System.out.println(" 亲!!");
}
}
该类有熟悉:x,y 方法:add,bdd,cdd(在类声明的,其中bdd,cdd 为私有方法)
2.建立测试类Test,访问Tank类的信息。
package ReflectJava;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
Class t = Tank.class; //得到Tank类的Class 对象
Object o = t.newInstance();// 通过class 对象实实例化一个Tanke对象
//-------------------Method 类的方法测试------------------------------
Method[] methods = t.getDeclaredMethods();
// getDeclaredMethods() 方法得到的是该类声明的方法,包括私有,公有方法
Method[] methoods = t.getMethods();
//getMethods() 方法得到 该类所有的公有方法
System.out.println("-------通过getDeclaredMethods()得到方法------------");
for(Method s: methods){
System.out.println(s.getName());
}
System.out.println("-------通过getMethods()得到方法------------");
for(Method ss: methoods){
System.out.println(ss.getName());
}
Method m1 = t.getDeclaredMethod("add");
Method m2 = t.getMethod("bdd");
// System.out.println(m2.invoke(o));
System.out.println(m2.invoke(o));
//---------------------------------------------------------------
}
}
测试结果:
-------通过getDeclaredMethods()得到方法------------
bdd
cdd
add
-------通过getMethods()得到方法------------
add
hashCode
getClass
wait
wait
wait
equals
toString
notify
notifyAll
通过测试类,明确
getMethods,getDeclareMethods,getMethod,getDeclareMethod 方法的区别:
// 返回方法数组
getMethods:返回该类的所有方法,但不包括私有方法
getDeclareMethods:返回该该类所有显示声明的方法,包括私有方法
// 返回特定方法
getMethod:返回该类的任何公有方法。
getDeclareMethod:返回该类的显示声明的公,私有方法。
总结: 只有getDeclareMethods,getDeclareMethod方法才能返回私有方法。
其他的只能返回公有方法。
也就是说对于返回明确的方法如:getMethod("方法名",Class[]{....}) 其方法名必须是公有的,否则程序运行时会报错。
关于方法参数设置问题:
public Method getMethod(String name,
Class<?>... parameterTypes)
如果要反射到public int add(int x,int y) 方法
则 对应参数设置为:
Method ss = getMethod("add",new
Class[]{int.class,int.class});
例如 类 Tank t = new Tank();
调用该方法: ss.invoke(t,new Object[]{3,4});
注意:如果ss 为私有方法时,则调用ss.invoke方法时,运行时出现错误。
此时应该调用ss.setAccessible(true); 遏制jvm权限范围检查。
分享到:
相关推荐
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。...
浅析Java引用类型和方法参数传递,浅析Java引用类型和方法参数传递
JavaNIO浅析IO模型Java开发Java经验技巧共10页.pdf.zip
声音技术浅析.doc
Java内存分析
java组件的浅析
浅析PCB两种重要可靠性测试方法.pdf
}关于FutureTask这个类的实现,我在前面的JAVA LOCK代码浅析有讲过其实现原理,主要的思想就是关注任务完成与未完成的状态,任务提交线程get()结
大多数程序设计语言具有传值调用和传引用调用的两种方法.通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能...
浅析软件测试中的回归测试 浅析软件测试中的回归测试
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
基于Java的Web开发技术浅析
Java语言中This关键字应用浅析,看完后帮助于JAVA中类的操作。
浅析Java设计模式【1】——观察者!
java 中文乱码浅析及解决方案
给大家分析了Java 反射机制的用途和缺点以及相关知识点内容,有兴趣的朋友可以参考学习下。
Java中main()方法浅析.docx
浅析JAVA编程中异常处理的方法与技巧
浅析JAVA编程中异常处理的方法与技巧.pdf