反射概念
Java反射機制是指在運行狀態(tài)中,對于任意一個類误证,都能知道這個類的屬性和方法培愁。這樣動態(tài)獲取新的以及動態(tài)調(diào)用對象方法的功能就叫做反射。
如何使用反射
A.使用Class類布蔗,獲取出被解刨的這個類的class文件對象。
B.使用Class類方法浪腐,獲取出類中的所有成員纵揍。
C.將成員獲取出來后,交給對應(yīng)類议街,對應(yīng)類中的方法泽谨,運行成員。
如何獲取.class文件對象
1.使用類的對象獲取
每個類都使用Object作為父類,Object類方法getClass()返回這個類的class文件對象吧雹,方法返回Class類型對象骨杂。
2.使用類的靜態(tài)屬性獲取
類名.class返回這個類的class文件對象,屬性運行結(jié)果也是Class類型對象雄卷。
3.使用Class類的靜態(tài)方法獲取
Class類靜態(tài)方法forName(String 全類名)腊脱。
public class Person {
}
public class Person1 {
public String name = "smt";
private String idcard = "10086";
public Person1(){
System.out.println("Person1類無參數(shù)構(gòu)造器");
}
public Person1(int a,int b,String s){
System.out.println("Person1類三參數(shù)構(gòu)造器");
}
private Person1(int a){
System.out.println("Person1類參數(shù)構(gòu)造器");
}
@Override
public String toString() {
return "Person1{" +
"name='" + name + '\'' +
", idcard='" + idcard + '\'' +
'}';
}
public void show(){
System.out.println("show 空參數(shù)");
}
public void show(int a){
System.out.println("show int參數(shù)");
}
public void show(String a){
System.out.println("show String參數(shù)");
}
}
public class TestReflection {
public static void main(String [] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Person person = new Person();
Class<? extends Person> personClass = person.getClass();
System.out.println(personClass);
Class<Person> aClass = Person.class;
System.out.println(aClass);
Class<?> forName = Class.forName("com.huawei.solar.reflect.Person");
System.out.println(forName);
System.out.println(forName == aClass);
System.out.println(personClass == aClass);
Class<?> person1 = Class.forName("com.huawei.solar.reflect.Person1");
Constructor<?>[] constructors =
person1.getConstructors();
for (Constructor con : constructors){
System.out.println(con);
}
Constructor<?> cc = person1.getConstructor();
Object o = cc.newInstance();
Constructor<?> cc1 = person1.getConstructor(int.class, int.class, String.class);
Object haha = cc1.newInstance(1, 2, "haha");
Constructor<?> cc2 = person1.getDeclaredConstructor(int.class);
//取消封裝
cc2.setAccessible(true);
Object o1 = cc2.newInstance(1);
person1.newInstance();
System.out.println("-------------------------------");
Field[] fields = person1.getFields();
for (Field field : fields){
System.out.println(field);
}
Field name = person1.getField("name");
name.set(o,"Uart");
System.out.println(o);
Field idcard = person1.getDeclaredField("idcard");
idcard.setAccessible(true);
idcard.set(o,"123456");
System.out.println(o);
System.out.println("-------------------------------");
Method[] methods =
person1.getMethods();
for (Method m : methods){
System.out.println(m);
}
Method show = person1.getMethod("show");
show.invoke(o);
Method show1 = person1.getMethod("show", int.class);
show1.invoke(o,1234);
Method show2 = person1.getMethod("show", String.class);
show2.setAccessible(true);
show2.invoke(o,"Uart");
}
}
class com.uart.solar.reflect.Person
class com.uart.solar.reflect.Person
class com.uart.solar.reflect.Person
true
true
public com.uart.solar.reflect.Person1(int,int,java.lang.String)
public com.uart.solar.reflect.Person1()
Person1類無參數(shù)構(gòu)造器
Person1類三參數(shù)構(gòu)造器
Person1類參數(shù)構(gòu)造器
Person1類無參數(shù)構(gòu)造器
-------------------------------
public java.lang.String com.uart.solar.reflect.Person1.name
Person1{name='Uart', idcard='10086'}
Person1{name='Uart', idcard='123456'}
-------------------------------
public java.lang.String com.uart.solar.reflect.Person1.toString()
public void com.uart.solar.reflect.Person1.show()
public void com.uart.solar.reflect.Person1.show(int)
public void com.uart.solar.reflect.Person1.show(java.lang.String)
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public final void java.lang.Object.wait() 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()
show 空參數(shù)
show int參數(shù)
show String參數(shù)