关于 blog light 创建对象 type() pre sta .get
一、Class 类
1、类是对象,类是 java.lang.Class 类的实例对象,这个对象称为该类的类类型;
2、任何一个类都是 Class 的实例对象,类的表达式:
(1)Class c1 = int.Class;
(2) Class c2 = c1.getClass();
(3) Class c3 =null; c3 = Class.forName ("com.imooc.reflect.Foo");
3、任何一个类都有一个隐含的静态成员变量;
4、创建类类型创建该类的实例对象:
c1.newInstance();// 需要进行强制类型转换,前提是需要有无参数的构造方法
5、Class.forName("类的全称") 不仅表示了类的类类型,还表示了动态加载类;
6、编译时刻加载类是静态加载类,运行时刻加载类是动态加载类;
7、通过 new 创建对象是静态加载类,在编译时刻就需要加载所有的可能使用到的类;
二、方法的反射
1、如何获得方法
方法名和方法的参数列表才能唯一决定某个方法;
2、方法的反射操作
method.invoke(Object,fields);// 和直接调用的效果一样
3、为什么要用到方法的反射
指定方法名调用方法,例如通过标准的 javabean 的属性名获取其属性值
4、通过 Class,Method 来认识泛型的本质:
反射的操作都是编译后的操作,编译之后集合的泛型是去泛型化的
Java 中集合的泛型是防止错误输入的,只在编译阶段有效,绕过编译就无效了(绕过编译就绕过了泛型)
三、成员变量的反射
1、获取成员变量信息
(1)成员变量也是对象,Java.lang.reflect.Field
(2)Field 类封装了关于成员变量的操作
(3)getFields() 方法获取的是所有的 Public 的成员变量的信息
(4)getDeclaredFields() 获取的是该类自己声明的成员变量的信息
四、构造方法的放射
1、构造函数也是对象,java.lang.Constructor 中封装了构造函数的操作
2、getConstructors 获取所有的 public 的构造方法
3、getDeclaredConstructors 获取的是所有的构造函数
4、3 中获取的构造函数,Constructor.getParameterTypes() 得到的是参数列表的类类型
五、Java 类的加载机制
1、类名. getName(),获取类的类类型的全程;
2、类名. getSimpleName(),获取类类型名称,不含包名
3、getDeclaredMethods() 获取的是所有该类自己声明的方法
4、Method 类,方法对象,一个成员方法就是一个 Method 对象
5、gerMethods() 获取类的方法,取的是所有 public 的函数,包括从父类继承而来的,不问访问权限
6、getReturnType() 获取方法的返回值的类类型
7、getParameterTypes() 得到参数列表的的类型的类类型
最后附上反射部分的练习代码:
- public class ReflectTest {
- public static void main(String args[]){
- try {
- Class class1 = String.class;//创建对象class1
- //Class class2 = float.class;//创建对象class1
- Field[] field=class1.getFields();//获取class1的所有成员变量
- Method[] methods =class1.getMethods();//获取class1的所有方法
- Constructor[] constructor=class1.getConstructors();//获取class1的所有构造方法
- System.out.println("=======class1的成员变量======");
- for (Field field2 : field) {
- System.out.println(field2.getName());
- }
- System.out.println("=======class1的所有方法======");
- for (Method m : methods) {//遍历class1的所有方法
- System.out.print(m.getName()+"(");
- Parameter[] pms=m.getParameters();
- for (Parameter p : pms) {//遍历方法的参数列表
- System.out.print(p.getType()+",");
- }
- //m.invoke(obj, args);
- System.out.println(")");
- }
- System.out.println("=======class1的所有构造方法======");
- for (Constructor constructor2 : constructor) {//遍历class1的所有构造方法
- System.out.print(constructor2.getName()+"(");
- Parameter[] pm2 = constructor2.getParameters();
- for (Parameter pc : pm2) {//遍历构造方法的参数列表
- System.out.print(pc.getType().getName()+",");
- }
- System.out.println(")");
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
java 进阶——反射(Reflect)
来源: http://www.bubuko.com/infodetail-2026319.html