框架設(shè)計的靈魂
框架:半成品軟件柿汛】撩可以在框架的基礎(chǔ)上進(jìn)行軟件開發(fā)鸠窗,簡化編碼胯究。
什么是反射:將類的各個組成部分封裝稱其他對象
好處:
1.可以在程序運(yùn)行過程中裕循,操作這些對象。
2.可以接偶硅则,提高程序的可擴(kuò)展性株婴。
反射類: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("全類名"):將字節(jié)碼文件加載到內(nèi)存
#多用于配制文件困介,將類名定義在配制文件中。讀取文件徒扶,加載類
2.類名.class:通過類名的屬性.class獲取
#多用于參數(shù)的傳遞
3.對象.getClass():getClass在Object類中定義
#多用于對象獲取字節(jié)碼
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
結(jié)論:同一個字節(jié)碼文件(.class)在一次程序運(yùn)行過程中姜骡,只會被加載一次屿良,不論通過哪一種方式獲取
Class對象的功能
1.獲取成員變量
getFields: 獲取public成員變量
getDeclaredFields:獲取所有成員變量
getField(String name):獲取public具體的成員變量
getDeclaredField(String name):獲取具體的成員變量
獲取field值管引,設(shè)置field值
Class personClass = Person.class;
Object personClassInstance = personClass.newInstance();//創(chuàng)建實例對象
Field name = personClass.getDeclaredField("name");
name.setAccessible(true); //暴力反色號
Object o = name.get(personClassInstance);//獲取值
System.out.println(o);
name.set(personClassInstance,"zhang");//設(shè)置值
Object o1 = name.get(personClassInstance);
System.out.println(o1);
2.獲取構(gòu)造方法
getConstructors()
getConstructor(Class<?>... parameterTypes)//不帶Declared是獲取public修飾的構(gòu)造方法
getDeclaredConstructors()
getDeclaredConstructor(Class<?>... parameterTypes) 參數(shù)
//獲取構(gòu)造方法
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:參數(shù)列表
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();