1.反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1.可以在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性
2.获取Class对象的几种方式
1.Class.forName(“全类名”):将字节码文件加载进来,返回Class对象
2.类名.class:通过类名的属性class获取
3.对象.getClass 通过Object类定义的方法获取
Person p = new Person();//创建Person类的对象
Class clazz1 = Class.forName("com.xunrui.bean.Person");// Class.forName("全类名")
Class clazz2 = Person.class;//类名获取
Class clazz3 = p.getClass();//对象获取
3.获取成员属性的方法
Field[] fields = clazz1.getFields(); //获取所有公共成员变量
for(Object o :fields){ //通过遍历获取成员变量
System.out.println(o);
}
Field name1 = clazz1.getField("a"); //通过成员变量的名字 获取成员变量对象
name1.set(p,"张三"); //操作成员变量a
Object o1 = name1.get(p);
System.out.println(o1);
<!-------------非公有的成员变量获取方式--------------->
Field[] fieldss = clazz1.getDeclaredFields(); //获取所有的成员变量(包含私有的)
for(Object o :fieldss){
System.out.println(o);
}
Field name2 = clazz1.getDeclaredField("name");
name2.setAccessible(true); //由于Private String name; 是非public的 故而需要暴力反射 去掉私有权限
name2.set(p,"私有权限的张三"); //操作成员变量a
Object o2 = name2.get(p);
System.out.println(o2);
4.获取对象的过程
//对象的获取过程
Constructor[] constructors = clazz1.getConstructors();
for (Object o:constructors) {
System.out.println(o);
//public com.xunrui.bean.Person()
//public com.xunrui.bean.Person(java.lang.String,int)
}
//创建有参非私有的构造函数
Constructor constructor = clazz1.getConstructor(String.class,int.class);//获取构造函数
Person person = (Person) constructor.newInstance("张三",23);
//Person person1 = (Person) clazz1.newInstance(); //使用构造函数创建无参对象
System.out.println(person);
//私有的构造获取
Constructor[] declaredConstructors = clazz1.getDeclaredConstructors();
for (Object o:declaredConstructors) {
System.out.println(o);
}
//创建有参非私有的构造函数
Constructor declaredConstructor = clazz1.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);//去除私有
Person person1 = (Person) declaredConstructor.newInstance("李四",24);
System.out.println(person1);
5.获取方法的过程
Method[] methods = clazz1.getMethods(); //获取所有的public的方法
// Method[] declaredMethods = clazz1.getDeclaredMethods(); 获取包含私有方法的方法数组
for (Object o : methods) {
System.out.println(o);
/*
*public java.lang.String com.xunrui.bean.Person.toString()
public java.lang.String com.xunrui.bean.Person.getName()
public void com.xunrui.bean.Person.setName(java.lang.String)
public void com.xunrui.bean.Person.eat(java.lang.String)
public void com.xunrui.bean.Person.setAge(int)
public int com.xunrui.bean.Person.getAge()
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
*/
}
Method method = clazz1.getMethod("eat", String.class);//获取指定方法
//Method method1 = clazz1.getDeclaredMethod("eat", String.class);//获取private的方法
//method1.setAccessible(true);//去除私有 暴力反射
method.invoke(person, "饭");//执行方法