【黑马程序员】java反射的学习总结
2014-06-17 09:44
387 查看
---------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------
/**
* 反射就是在运行期间动态获取信息和动态调用对象的方法的功能
*
* (1)首先要获得类类型 Class Xxx
* a。Class Xxx=Class.forname("Xxx")
* b。Class Xxx=Xxx.class
* c. Class Xxx=xxx.getClass()
* 其中主要用a和b,c需要实例来调用getclass方法,比较麻烦
*
* (2)创建类实例
* a. Object xxx=Xxx.newInstance();
* Xxx必须要有无参构造函数,否则必须先获取构造函数
* b. Object xxx=Xxx.getConstruct( ... ).newInstance( ... );
* 前后参数列表类类型需要一致
*
* (3)获取构造函数
* 一般:Method method=Xxx.getConstruct(...)
* 其中参数是要获取的构造函数的参数列表类类型,无参就是null
* 调用构造函数:metod.invoke(xxx,...)
*
* (4)获取一般函数
* a.Method m=Xxx.getMethod("函数名", ... )
* b.获取公有方法:Method[] m=Xxx.getMethods()
* c。获取私有发放 Method m=Xxx.gerDeclareMethod("函数名", ... )
* d。获取本类所有方法:Method[] m=Xxx.getDeclareMethods()
* 使用:method.invoke(xxx, ... )
* 使用私有方法前要先设置m.setAccessible(true);
*
* (5)获取字段
* Field field=Xxx.getDeclaredField(" ");
* 若要访问私有字段 field.setAccessible(true);
* 取:Object obj=field.get(xxx)
* 存:field.set(xxx, )
*
* ( 以下是我的练习代码)
*/
---------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------
/**
* 反射就是在运行期间动态获取信息和动态调用对象的方法的功能
*
* (1)首先要获得类类型 Class Xxx
* a。Class Xxx=Class.forname("Xxx")
* b。Class Xxx=Xxx.class
* c. Class Xxx=xxx.getClass()
* 其中主要用a和b,c需要实例来调用getclass方法,比较麻烦
*
* (2)创建类实例
* a. Object xxx=Xxx.newInstance();
* Xxx必须要有无参构造函数,否则必须先获取构造函数
* b. Object xxx=Xxx.getConstruct( ... ).newInstance( ... );
* 前后参数列表类类型需要一致
*
* (3)获取构造函数
* 一般:Method method=Xxx.getConstruct(...)
* 其中参数是要获取的构造函数的参数列表类类型,无参就是null
* 调用构造函数:metod.invoke(xxx,...)
*
* (4)获取一般函数
* a.Method m=Xxx.getMethod("函数名", ... )
* b.获取公有方法:Method[] m=Xxx.getMethods()
* c。获取私有发放 Method m=Xxx.gerDeclareMethod("函数名", ... )
* d。获取本类所有方法:Method[] m=Xxx.getDeclareMethods()
* 使用:method.invoke(xxx, ... )
* 使用私有方法前要先设置m.setAccessible(true);
*
* (5)获取字段
* Field field=Xxx.getDeclaredField(" ");
* 若要访问私有字段 field.setAccessible(true);
* 取:Object obj=field.get(xxx)
* 存:field.set(xxx, )
*
* ( 以下是我的练习代码)
*/
package threaddemo.src; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectTest { public static void main(String[] arg)throws Exception{ Class<MyClass> clazz=MyClass.class; //调用类型的公有字段获取类类型 Method method=clazz.getMethod("printStr",String.class,int.class); //获取公有函数 Method privateMethod=clazz.getDeclaredMethod("privateFun",String.class); //获取私有函数 method.invoke(clazz.newInstance(),"ni hao ma?",333); //调用公有函数 privateMethod.setAccessible(true); privateMethod.invoke(clazz.newInstance(),"haha"); //调用食欲函数 Class clas1=Class.forName("threaddemo.src.MyClass"); //用类名获取类类型 Constructor constructor=clas1.getConstructor(String.class); Object o1=constructor.newInstance("hehe"); //调用有参构造函数创建对象 Object o2=clas1.newInstance(); //调用无参构造函数创建对象 Method method2=clas1.getMethod("disp",int.class); method2.invoke(o2,3); //获取和使用单个公有函数 Method[] clas1fun=clas1.getMethods(); System.out.println("clas1fun have "+clas1fun.length +"function"); clas1fun[0].invoke(o1,"xxoo",123); clas1fun[1].invoke(o1,3); //获取和使用多个函数 for(int i=0;i<clas1fun.length;i++){ System.out.println(clas1fun[i].getName()); } //打印函数列表 Field field=clas1.getDeclaredField("age"); //field.setAccessible(true); //私有字段操作前要设置 Object obj=field.get(o1); System.out.println(obj); field.set(o1,87); System.out.println(field.get(o1)); //字段的存取 } } class MyClass{ public MyClass(){} public int age=99; public MyClass(String str){ System.out.println("public MyClass(String):"+str); } public void printStr(String str,int a){ System.out.println("public printStr(String,int):"+str+" "+a); } public void disp(int a){ System.out.println("public disp(int):"); for(int i=0;i<a;i++){ for(int j=0;j<a;j++){ System.out.print("*"); } System.out.println(); } } private void privateFun(String str){ System.out.println("private privateFun:"+str); } }
---------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! -----------
相关文章推荐
- 黑马程序员——Java高新技术之反射学习总结一
- 黑马程序员——Java学习笔记之13——“反射”总结
- 黑马程序员—JAVA基础学习日记十——反射学习总结
- 黑马程序员学习log第九篇基础知识:JAVA的面向对象之正则表达式及反射总结
- 黑马程序员——Java学习总结:反射
- 黑马程序员_Java反射技术学习总结
- 黑马程序员--java学习之反射总结
- 黑马程序员_java基础知识学习总结四
- 黑马程序员Java学习-银行业务调度系统总结
- 黑马程序员_java反射学习
- 黑马程序员——java学习数组的总结
- 黑马程序员_Java学习日记3_面向对象总结2
- 黑马程序员_java学习日记_Java高新技术_反射(一)
- 黑马程序员_java学习日记_Java高新技术_反射(二)
- 黑马程序员_Java学习日记7_String总结
- 黑马程序员__JAVA高新技术--反射、注解总结
- 黑马程序员_Java学习日记2_面向对象总结1
- JAVA 反射学习总结
- 黑马程序员_Java学习日记4_面向对象总结3
- 黑马程序员——java语言基础——总结一下学习过的类