码迷,mamicode.com
首页 > 其他好文 > 详细

反射(reflect)

时间:2017-09-18 15:47:45      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:pes   自己   obj   验证   enc   阶段   错误   style   int   

×

× 反射中类类型(ClassType)、类(class)、实例对象(Instance)的关系
技术分享

 

× 动态加载类

1 try {
2     Class c = Class.forName("className");//驱动加载也是长这样的
3 } catch (ClassNotFoundException e) {
4     e.printStackTrace();
5 }

 

一、类类型(Class)的三种表现形式(一个类[class]只能有一个类类型对象[ClassType])

1 Class c = className.class;
2 Class c = classNameInstence.getClass;
3 Class c = Class.forName("类的全称[packageName.className]");

二、通过获取到的类类型对象进行实例创建(所创建的对象为class的实例,Class的实例)

className instance = (className) c.newInstance(); 
技术分享

三、获取方法信息(函数的反射) -— java.lang.reflect.Method类
 相关函数 (c:类的类类型;getDeclaredXxx():不包括父类继承而来,且自己声明、不问访问权限的成员)
   1. Method method = c.getMethod("methodName", parameterTypes); // 返回类中指定的public函数 。包括父类继承而来的
       Method method = c.getDeclaredMethod(); //返回类中指定的自身声明的函数,不包括父类继承而来的
   2. Method[ ] method = c.getMethods(); // 获取该类中所有public的方法,包括父类继承而来的。
       Method[ ] method = c.getDeclaredMethods(); 获取该类中所有该类自己声明的方法,不问访问权限。
演示代码

 1         // Class c = className.class
 2         // Class c = Class.forName("");
 3         Class c = instance.getClass();// 获取类类型对象
 4         System.out.println("类名称:" + c.getName());
 5         Method[] mets = c.getMethods();// 获取所有方法
 6         for (int i = 0; i < mets.length; i++) {
 7             Class returnType = mets[i].getReturnType();// 返回值类型的类类型
 8             System.out.print(returnType.getName() + " ");// 获取并输出返回值类型
 9             System.out.print(mets[i].getName() + "( ");// 获取并输出方法名称
10 
11             // 获取参数类型
12             Class[] paramTypes = mets[i].getParameterTypes();// 返回参数列表的类型的类类型
13             for (int j = 0; j < paramTypes.length; j++) {
14                 if (i == (paramTypes.length - 1)) {
15                     System.out.print(paramTypes[j].getName());
16                 } else {
17                     System.out.print(paramTypes[j].getName() + ",");
18                 }
19             }
20             System.out.println(")");
21         }

 四、获取变量信息(变量)

 1         // Class c = className.class
 2         // Class c = Class.forName("");
 3         Class c = obj.getClass();
 4         /*
 5          * 成员变量也是对象
 6          * java.lang.reflect.Field
 7          * Field类封装了关于成员变量的操作
 8          * getFields()方法获取的是所有的public的成员变量的信息
 9          * getDeclaredFields获取的是该类自己声明的成员变量的信息
10          */
11         //Field[] fs = c.getFields();
12         Field[] fs = c.getDeclaredFields();
13         for (Field field : fs) {
14             //得到成员变量的类型的类类型
15             Class fieldType = field.getType();
16             String typeName = fieldType.getName();
17             //得到成员变量的名称
18             String fieldName = field.getName();
19             System.out.println(typeName+" "+fieldName);
20         }

  五、获取构造函数信息

 1         // Class c = className.class
 2         // Class c = Class.forName("");
 3         Class c = obj.getClass();
 4         /*
 5          * 构造函数也是对象
 6          * java.lang. Constructor中封装了构造函数的信息
 7          * getConstructors获取所有的public的构造函数
 8          * getDeclaredConstructors得到所有的构造函数
 9          */
10         //Constructor[] cs = c.getConstructors();
11         Constructor[] cs = c.getDeclaredConstructors();
12         for (Constructor constructor : cs) {
13             System.out.print(constructor.getName()+"(");
14             //获取构造函数的参数列表--->得到的是参数列表的类类型
15             Class[] paramTypes = constructor.getParameterTypes();
16             for (Class class1 : paramTypes) {
17                 System.out.print(class1.getName()+",");
18             }
19             System.out.println(")");
20         }

 六、方法的反射操作

1 method.invoke("对象",{参数列表}); //没错,就这样...
2 //Object o = m.invoke(a1,new Object[]{10,20});
3  Object o = m.invoke(a1, 10,20);

通过反射机制了解泛型
* c1==c2结果返回true说明编译之后集合的泛型是去泛型化的
* Java中集合的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了
* 验证:我们可以通过方法的反射来操作,绕过编译
* 结论:泛型尽在编译时起作用,防止错误操作,与序列化有些相似

反射(reflect)

标签:pes   自己   obj   验证   enc   阶段   错误   style   int   

原文地址:http://www.cnblogs.com/EvansChan/p/7506986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!