java反射详解
概述
JAVA反射机制:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射(Reflection)被视为动态语言的关键,
反射是框架的灵魂。
反射的优点
1 可以在程序运行过程中,操作这些对象
2 可以解耦,提高程序可扩展性
反射获取字节码class对象的方式
// 实例代码
package reflectionday01;
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public Person() {
}
}
1.Class.forName(“类全名”);将字节码文件加载进内存,返回class对象;
多用于配置文件,将类名将类名定义在配置文件中,读取文件,加载类.
public static void main(String[] args) throws ClassNotFoundException {
// Class.forName("类全名");将字节码文件加载进内存,返回class对象;
Class cls = Class.forName("reflectionday01.Person");
System.out.println(cls);
}
2 类名.class;通过类名的属性class获取
多用于参数的传递
public static void main(String[] args) throws ClassNotFoundException {
// 类名.class;通过类名的属性class获取
Class<Person> personClass = Person.class;
System.out.println(personClass);
}
3 对象.getclass();getclass()方法在object类中定义着;
多用于对象获取字节码 方式
public static void main(String[] args) throws ClassNotFoundException {
//对象.getclass();getclass()方法在object类中定义着;
Person person =new Person();
Class cls = person.getClass();
System.out.println(cls);
}
总结
同一个字节码文件(.class)再一次程序运行中,只会被加载一次,不论通过哪种方式获取的class 对象都是同一个。
class 对象功能
获取功能:
1.获取成员变量们
Field[] getFields(); //获取所有的 public 修饰的成员变量
Field getField(String name)
Field[] declaredFields = personClass.getDeclaredFields(); //获取所有的成员
Field name = personClass.getDeclaredField(“name”);
// 暴力反射 获取私有 成员变量
name.setAccessible(true);
Object o = name.get(p);
System.out.println(o);
name.set(p,"zhangsan");
System.out.println(p.getName());
Field:成员变量操作
1 设置值
set(object obj.object value)
2 获取值
get(object o);
3 忽略访问权限修饰符的安全检查 暴力反射
setAccessible(boolean flag): true 忽略
2 获取构造方法们
1 Constructor getConstructor(Class<?>… parameterTypes)
Constructor constructor = personClass.getConstructor(String.class, Integer.class);
//创建对象
Object peo = constructor.newInstance(“张三”, 19);
System.out.println(peo);
Constructor:构造方法
1 创建对象
newInstance(Object … initargs)
2 如果使用空参构造方法 可以直接使用 class 的 newInstance 方法
3 忽略访问权限修饰符的安全检查 暴力反射
setAccessible(boolean flag): true 忽略
3 获取成员方法们
Method[] methods = clsq.getMethods();
Method method = clsq.getMethod(String name, Class<?>… parameterTypes)
4 获取类名
String getName();