反射必须依赖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());
网友评论