反射:就是通過class文件對象,去使用該文件中的成員變量,構造方法,成員方法。
Class類:
成員變量 Field
構造方法 Constructor
成員方法 Method
獲取class文件對象的方式:
A.Object類的getClass()方法
B.數據類型的靜態屬性class
C.Class類中的靜態方法
public static Class forName(String className)//全路徑
代碼如下:
class ReflectDemo{
public static void main(String[] args) {
Person p = new Person();
Class c = p.getClass();
Person p1 = new Person();
Class c1 = p1.getClass();
System.out.println(p==p1);//false
System.out.println(c==c1);//true
}
}
class Person {
private String name;
int age;
public String address;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public void show() {
System.out.println("show");
}
public void method(String s) {
System.out.println("method" + s);
}
public String getString(String s, int i) {
return s + "-----" + i;
}
private void function(){
System.out.println("function");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
通過反射獲取構造方法並使用
獲取構造方法
getConstructors
getDeclaredConstructors
創建對象
newInstance()
con.newInstance(“zhangsan", 20);
通過反射獲取成員變量並使用
獲取所有成員
getFields,getDeclaredFields
獲取單個成員
getField,getDeclaredField
修改成員的值
set(Object obj,Object value)
將指定對象變量上此 Field 對象表示的字段設置爲指定的新值。
通過反射獲取成員方法並使用
獲取所有方法
getMethods
getDeclaredMethods
獲取單個方法
getMethod
getDeclaredMethod
暴力訪問
method.setAccessible(true);