反射機制
反射機制是什么
1.反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;
2.對于任意一個物件,都能夠呼叫它的任意一個方法和屬性;
3.這種動態獲取的資訊以及動態呼叫物件的方法的功能就是反射機制;
4.也就是說通過反射機制,我們可以獲取想要獲取到的東西,對前面所學到的范圍限定詞的限制就可以打破約束
反射機制的作用
1.在運行時判斷任意一個物件所屬的類;
2.在運行時構造任意一個類的物件;
3.在運行時判斷任意一個類所具有的成員變數和方法;
4.在運行時呼叫任意一個物件的方法;
5.生成動態代理;
反射機制的使用
由于反射機制操作的是類的位元組碼檔案物件,所以想要使用反射機制就必須獲取到該類的位元組碼檔案,獲取類的位元組碼檔案有3種操作方式
1.通過Class類中的靜態方法forName();可以獲取到位元組碼物件
Class class1 = class.forName("包名.類名")
2.直接用該類.class獲取位元組碼檔案物件
Class class2 = Dog.class;
3.通過類的實體獲取該類的位元組碼檔案物件
Class class3 = new Dog().getClass();
getDeclaredFields 和 getFields 的區別
- getDeclaredFields()獲得某個類的所有申明的欄位,即包括public、private和proteced,但是不包括父類的申明欄位,
- getFields()獲得某個類的所有的公共(public)的欄位,包括父類,
獲取類中的資訊
import java.lang.reflect.Field;
class Person extends Human{
public int age;
private String name;
protected long id;
}
class Human{
public int hight;
}
public class Main{
public static void main(String[] args) {
Class class1 = Person.class;
Field[] f1 = class1.getFields();//獲取到所有被public修飾的類資訊,包括父類中的
for(Field f:f1)
System.out.println(f);
Field[] f2 = class1.getDeclaredFields();//獲取到本類中所有類的資訊
for(Field f:f2)
System.out.println(f);
}
}
獲取指定的類屬性物件
import java.lang.reflect.Field;
class Person extends Human{
public int age;
private String name;
protected long id;
}
class Human{
public int hight;
}
public class Main{
//因為存在訪問不到的可能,所以需要拋出例外
public static void main(String[] args)throws Exception {
Class class1 = Person.class;
Field f1 = class1.getField("age");//只能獲取父類及本類被public修飾的類屬性
Field f2 = class1.getDeclaredField("name");//可以任意獲取本類中的指定類屬性
System.out.println(f1);
System.out.println(f2);
}
}
獲取構造方法資訊
import java.lang.reflect.Constructor;
class Person extends Human {
public int age;
private String name;
protected long id;
public Person(int age, String name, long id) {
this.age = age;
this.name = name;
this.id = id;
}
public Person() {
}
private Person(int age, String name) {
this.age = age;
this.name = name;
}
}
class Human {
public int hight;
}
public class Main {
public static void main(String[] args) throws Exception {
Class class1 = Person.class;
Constructor[] c1 = class1.getConstructors();//獲取所有被public修飾的構造器
for (Constructor c : c1)
System.out.println(c);
System.out.println("--------------");
Constructor[] c2 = class1.getDeclaredConstructors();//獲取本類所有的構造器
for (Constructor c : c2)
System.out.println(c);
}
}
獲取指定的構造方法
import java.lang.reflect.Constructor;
class Person extends Human {
public int age;
private String name;
protected long id;
public Person(int age, String name, long id) {
this.age = age;
this.name = name;
this.id = id;
}
public Person() {
}
public Person(int age) {
}
private Person(int age, String name) {
this.age = age;
this.name = name;
}
}
class Human {
public int hight;
}
public class Main {
public static void main(String[] args) throws Exception {
Class class1 = Person.class;
Constructor c1 = class1.getConstructor(null);//無參構造器
System.out.println(c1);
Constructor c2 = class1.getConstructor(int.class);//有參構造器
System.out.println(c2);
System.out.println("--------------");
Constructor c3 = class1.getDeclaredConstructor(int.class,String.class);
System.out.println(c3);
}
}
獲取方法的資訊
import java.lang.reflect.Method;
class Person extends Human {
public int age;
private String name;
protected long id;
public Person(int age, String name, long id) {
this.age = age;
this.name = name;
this.id = id;
}
public Person() {
}
public Person(int age) {
}
private Person(int age, String name) {
this.age = age;
this.name = name;
}
public void aa() {
}
private void bb() {
}
private void cc() {
}
}
class Human {
public int hight;
}
public class Main {
public static void main(String[] args) throws Exception {
Class class1 = Person.class;
//獲取到本類被public修飾以及父類中被public修飾的方法
Method[] m1 = class1.getMethods();
for(Method m : m1)
System.out.println(m);
System.out.println("------------");
Method[] m2 = class1.getDeclaredMethods();//獲取到本類中所有的方法
for(Method m : m2)
System.out.println(m);
}
}
獲取指定方法的資訊
import java.lang.reflect.Method;
class Person extends Human {
public int age;
private String name;
protected long id;
public Person(int age, String name, long id) {
this.age = age;
this.name = name;
this.id = id;
}
public Person() {
}
public Person(int age) {
}
private Person(int age, String name) {
this.age = age;
this.name = name;
}
public void aa() {
}
private void bb(int x) {
System.out.println("bb方法");
}
private void cc() {
}
}
class Human {
public int hight;
public void oo() {
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class class1 = Person.class;
Method m1 = class1.getMethod("aa");//只能獲取本類及父類中被public修飾的方法
System.out.println(m1);
//可以獲取本類中所有任意指定的方法
Method m2 = class1.getDeclaredMethod("bb", int.class);
System.out.println(m2);
}
}
對反射機制的使用
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Person extends Human {
public int age;
private String name;
protected long id;
public Person(int age, String name, long id) {
this.age = age;
this.name = name;
this.id = id;
}
public Person() {
}
public Person(int age) {
}
private Person(int age, String name) {
this.age = age;
this.name = name;
}
public void aa() {
}
private void bb(int x) {
System.out.println("bb方法");
}
private void cc() {
}
public static void dd() {
}
}
class Human {
public int hight;
void oo() {
}
}
public class Main {
public static void main(String[] args) throws Exception {
Class class1 = Person.class;
Object obj = class1.newInstance();
//使用無參的構造方法創建物件
System.out.println(obj);
Constructor constructor1 =
class1.getDeclaredConstructor(int.class,String.class);
constructor1.setAccessible(true);
Object dog = constructor1.newInstance(10,"aa");
System.out.println(dog);
Field name = class1.getDeclaredField("name");
name.setAccessible(true);
name.set(dog, "張三");
//獲取dog物件的name屬性的值
System.out.println(name.get(dog));
Method aa = class1.getMethod("aa");
//呼叫了dog物件的aa方法
aa.invoke(dog);
Method bb = class1.getDeclaredMethod("bb", int.class);
bb.setAccessible(true);
//靜態方法將第一個引數設定為null
bb.invoke(dog, 10);
Method dd = class1.getDeclaredMethod("dd");
dd.invoke(null);
System.out.println(dd);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/267366.html
標籤:java
