框架设计的灵魂
框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。
什么是反射:将类的各个组成部分封装称其他对象
好处:
1.可以在程序运行过程中,操作这些对象。
2.可以接偶,提高程序的可扩展性。
反射类:Person.class
public class Person {
private String name;
private int age;
public String a;
protected String b;
String c;
private String d;
private Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
private void eat(String str){
System.out.println("eat....."+str);
}
}
获取Class对象的方式
1.Class.forName("全类名"):将字节码文件加载到内存
#多用于配制文件,将类名定义在配制文件中。读取文件,加载类
2.类名.class:通过类名的属性.class获取
#多用于参数的传递
3.对象.getClass():getClass在Object类中定义
#多用于对象获取字节码
Class personClass1 = Person.class;
Class personClass2 = Class.forName("cn.test.Person");
Class personClass3 = (new Person()).getClass();
System.out.println(personClass1);
System.out.println(personClass2);
System.out.println(personClass3);
System.out.println(personClass1 == personClass2);
System.out.println(personClass1 == personClass3);
personClass1 == personClass2 == personClass3
结论:同一个字节码文件(.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取
Class对象的功能
1.获取成员变量
getFields: 获取public成员变量
getDeclaredFields:获取所有成员变量
getField(String name):获取public具体的成员变量
getDeclaredField(String name):获取具体的成员变量
获取field值,设置field值
Class personClass = Person.class;
Object personClassInstance = personClass.newInstance();//创建实例对象
Field name = personClass.getDeclaredField("name");
name.setAccessible(true); //暴力反色号
Object o = name.get(personClassInstance);//获取值
System.out.println(o);
name.set(personClassInstance,"zhang");//设置值
Object o1 = name.get(personClassInstance);
System.out.println(o1);
2.获取构造方法
getConstructors()
getConstructor(Class<?>... parameterTypes)//不带Declared是获取public修饰的构造方法
getDeclaredConstructors()
getDeclaredConstructor(Class<?>... parameterTypes) 参数
//获取构造方法
Constructor[] constructors = personClass.getDeclaredConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
Constructor declaredConstructor = personClass.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);
Object zhangj = declaredConstructor.newInstance("zhangj", 30);
System.out.println(zhangj);
3.获取成员方法
getMethods()
getMethod(String name, Class<?>... parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name, Class<?>... parameterTypes)//name:方法名;parameterTypes:参数列表
class Person {
private void eat(String str){
System.out.println("eat....."+str);
}
}
//获取成员方法
Method[] methods = personClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
Method eatMethod = personClass.getDeclaredMethod("eat", String.class);
eatMethod.setAccessible(true);
eatMethod.invoke(personClassInstance,"面");
4.获取类名
personClass.getName();
personClass.getPackage().getName();
personClassInstance.getClass().getName();