java随笔

反射

2017-07-13  本文已影响5人  71150ce14a00

反射必须依赖Class类字节码文件

获取Class对象三种方式
1.类名.class String.class
2.Object中的对象.getClass() "".getClass();
3.Class 静态方法forName(name) Class.forName("包名.类名");

为什么使用第三种方式:
1.前两种必须知道类名,而第三种可以不用知道(根据key获取value类名)
2.第一种不执行静态代码块, 第二种在堆内开辟空间,浪费资源,第三种加载静态代码块jdbc链接
getName(); 获取指定类的全名 包名.类名
getSimpleName() 简单的名字 类名

预定义对象:8种基本数据类型+void

Field(成员变量), Contructor(构造函数),Method(成员方法)

Class 类中的newInstance() 根据Class创建对象
参数: 无参
局限性:
要求在对应类中必须有无参构造函数

Constructor类中的 newInstance(Object... initargs)
参数initargs: 可以是无参,也可以是多个参数

getDeclaredConstructor(Class...) 包括私有的构造方法
setAccessible(true); 取消java的访问权限、暴力访问
getConstructor(Class...) 不包括私有的构造方法

Class clazz = Class.forName("java.io.File");
Constructor con = clazz.getConstructors(String.class);
File f = (File)con.newInstance("F:\1.txt");
// 获取私有方法
Constructor con = clazz.getDeclaredConstructor(String.class,File.class);
con.setAccessible(true);
File f =(File)con.newInstance("1.jpg",new File("D:\test"));

获取方:
getMethod()包括父类方法
getDeclaredMethod(name,Class...) 不包括父类方法,如果方法没有参数,可以不写
执行方法
obj = invoke(obj,args) obj对象,如果是静态方法写null , args,参数:如果没有参数,,什么都不写
obj 方法返回值,如果没有返回值,返回null

获取属性

     // 获取私有属性
     Class clazz = Class.forName("com._21reflect.Person" );
     Person p = (Person) clazz.newInstance();
     Field f = clazz.getDeclaredField( "name");
     f.setAccessible( true);暴力访问
     f.set( p, "777");
     String s = (String) f.get( p);
     System. out.println(s );
     //获取共有属性
     Field f1 = clazz.getField( "age");
     f1.set( p, 23);
     System. out.println(f1 .getInt(p ));

获取成员方法:

          Class clazz = Class.forName("com._21reflect.Person" );
         Person p = (Person) clazz.newInstance();
          // 有返回值,有参数的公开函数
         Method m = clazz.getMethod("show", String.class) ;
         String s = (String) m.invoke( p, "6666");
         System. out.println(s );
          // 私有函数
         Method method = clazz.getDeclaredMethod("getMessage", String.class );
          method.setAccessible( true);
         String str = (String) method.invoke( p, "777");
         System. out.println(str );

获取构造方法:

          Class clazz = Class.forName("com._21reflect.Person" );
         Person p = (Person) clazz.newInstance();
          // 非私有
          Constructor c = clazz.getConstructor() ;
         Person f = (Person) c.newInstance();
          f.show( "sss");
          // 私有
          Constructor c2 = clazz.getDeclaredConstructor(String.class,int. class,String.class);
         Person p2 = (Person) c2.newInstance( "dubo",23,"北京" );
         System. out.println(p2 .getAddress()+p2.getName()+ p2.getAge());
上一篇下一篇

猜你喜欢

热点阅读