框架:半成品软件,再框架上开发,简化编码
(reflect)反射:将类的各个组成部分封装为其他对象,这就是反射机制
反射前提是:需要获取字节码文件再进行操作
成员变量,构造方法,成员方法
好处:
1程序运行过程中,操作这些对象
2可以解耦,提高程序的可扩展性
获取字节码对象的三种方式:
1class.forName(“全类名”):将字节码文件加载进内存,返回Class对象(多用于配置文件,将类名定义在配置文件中。读取文件,加载类)
2类名.class:通过类名的属性class获取 (多用于参数的传递)
3对象.getClass() (多用于对象的获取字节码的方式)
package cn.homework.reflect;
import cn.homework.domain.Person;
//练习获取Class字节码的方法
public class ReflectDemo1 {
public static void main(String[]args) throws ClassNotFoundException {
Class a = Person.class;//1.类名.class
Class a1 = Class.forName("cn.homework.domain.Person");//2.Class.forName("全类名")
Person p = new Person();
Class a2=p.getClass();//对象名.getClass
System.out.println(a==a1);
System.out.println(a==a2);
}
}
Class对象的功能
获取功能:
1获取成员变量们
Field[]getFields() :获取所有public修饰的成员变量
FieldgetField(String name) 获取指定名称的 public修饰的成员变量
Field[]getDeclaredFields() 获取所有的成员变量,不考虑修饰符
FieldgetDeclaredField(String name) private和其他权限的
package cn.homework.reflect;
import cn.homework.domain.Person;
import java.lang.reflect.Field;
//练习获取成员变量ieldF
public class ReflectDemo2 {
public static void main(String[]args) throws Exception{
//获取Class对象
Class personClass = Class.forName("cn.homework.domain.Person");
//Filed[] getFileds()获取所有public修饰的成员变量
Field[] fields = personClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("==================");
//Field getField(String name) 获取指定成员变量的值
Field a = personClass.getField("a");
Person p = new Person();
//a在p对象上的值
Object o = a.get(p);//Objectget(Object obj) 返回由该Field表示的字段在指定对象上的值。
//修改a在p对象上的值
a.set(p,"ao");
System.out.println(o);
System.out.println("======================");
//Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符
Field[] declaredFields = personClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("===================");
//Field getDeclaredField(String name)获取private修饰的变量
Field d = personClass.getDeclaredField("d");
//忽略访问权限符的安全检查
d.setAccessible(true);//暴力反射
Object o1 = d.get(p);//只有经过暴力反射的私有成员变量,才可以操作
System.out.println(o1);
}
}
2获取构造方法们
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(类<?>... parameterTypes)
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 涉及到private时候需要用暴力反射
Constructor<?>[]getDeclaredConstructors()
package cn.homework.reflect;
import cn.homework.domain.Person;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ReflectDemo3 {
public static void main(String[]args) throws Exception{
//获取Person的Class对象
Class personClass = Person.class;
//Constructor<T> getConstructor(Class<?>...parameterTypes)
Constructor constructor =personClass.getConstructor(String.class, int.class);
System.out.println(constructor);
//创建对象(用获取到的构造方法)
Object person = constructor.newInstance("矫健的步伐", 23);
System.out.println(person);
System.out.println("==================");
//创建对象(用获取到的类对象)
Object o = personClass.newInstance();
System.out.println(o);
}
}
3获取成员方法们
Method[] getMethods()
Method getMethod(String name, 类<?>... parameterTypes)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 类<?>... parameterTypes)
package cn.homework.reflect;
import cn.homework.domain.Person;
import java.lang.reflect.Method;
//获取成员方法们 Method
public class ReflectDemo4{
public static void main(String[]args) throws Exception {
//获取Person的Class对象
Class personClass = Person.class;
//获取指定名称的方法Method[] getMethod(String name,Class<?>...parameterTypes)
Method eat = personClass.getMethod("eat");
Person p = new Person();
//执行方法invoke(Object obj, Object... args)
// obj - 从底层方法被调用的对象
//args - 用于方法调用的参数
// 在具有指定参数的指定对象上调用此方法对象表示的基础方法
eat.invoke(p);
Method eat1 = personClass.getMethod("eat", String.class);
//执行方法
eat1.invoke(p,"土");
System.out.println("==================");
//获取所有public修饰的方法
Method[] methods = personClass.getMethods();
for (Method method : methods) {
System.out.println(method);
String name = method.getName();
System.out.println(name);
}
System.out.println("================");
//获取类名
String name = personClass.getName();
System.out.println(name);
}
}
4获取类名
String getName()
更多java技术性文章请扫描二维码关注下面公众号,每天都有技术更新哦!