Java複習第12天---12.3---基礎加強---反射2

Java複習第12天---12.3---基礎加強---反射2


目錄




內容

1、class對象功能

  常用功能分類

  • 獲取功能
    • 獲取構造器
      • Constructor[] getConstructors() //獲取所有的公有構造器
      • Constructor geConstructor(類<?>… parameterTypes) // 獲取指定的公有構造器
      • Constructor[] getDeclaredConstructors() // 獲取所有訪問權限的構造器
      • Constructor getDeclaredConstructor(類<?>… parameterTypes) // 獲取指定的構造器,訪問權限不限
    • 獲取成員變量
      • Field[] getFields()
      • Field getField(String name) // 返回一個 Field對象,它反映此表示的類或接口的指定公共成員字段 類對象。
      • Field[] getDeclaredFields()
      • Field getDeclaredField(String name)
    • 獲取方法
      • Method[] getMethods()
      • Method getMethod(String name, 類<?>… parameterTypes)
      • Method[] getDeclaredMethods()
      • Method getDeclaredMethod(String name, 類<?>… parameterTypes)
    • 獲取類名
      • String getName()

2、獲取Constructor

  這裏我們只演示public構造器的獲取,和創建對象。

  • 示例2-1:

      package reflect;
    
      public class Person {
      	private String name;
      	private int age;
    
      	public Person() {}
    
      	public Person(String name, int age) {
      		super();
      		this.name = name;
      		this.age = age;
      	}
    
      	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 + "]";
      	}
      }
      
      package reflect;
    
      import java.lang.reflect.Constructor;
      import java.lang.reflect.InvocationTargetException;
    
      public class TestReflectConstructor {
      	public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
      		Class<Person> cls = Person.class;
      		// 1、獲取帶參構造器
      		Constructor<Person> c1 = cls.getConstructor(String.class, int.class);
      		// 創建對象
      		Object obj1 = c1.newInstance("李四", 24);
      		System.out.println(obj1);
    
      		// 2、獲取無參構造器
      		Constructor<Person> c2 = cls.getConstructor();
      		// 創建對象
      		Object obj2 = c2.newInstance();
      		System.out.println(obj2);
    
      		// 3、無參構造器創建對象
      		Object obj3 = cls.newInstance();
      		System.out.println(obj3);
      	}
      }
      測試結果:
      Person [name=李四, age=24]
      Person [name=null, age=0]
      Person [name=null, age=0]
    

3、獲取Field

	package reflect;

	import java.lang.reflect.Field;

	public class TestReflectField {
		public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
			Class<Person> cls = Person.class;
			// 1、getFields
			Field[] f1 = cls.getFields();
			for(Field f: f1) {
				System.out.println(f);
			}
			System.out.println("========");
			// 2、getDeclaredFields
			Field[] f2 = cls.getDeclaredFields();
			for(Field f: f2) {
				System.out.println(f);
			}
			System.out.println("========");
			// 3、getField(String name)

			Field f3 = cls.getDeclaredField("name");
			f3.setAccessible(true);
			Person p = new Person();
			f3.set(p, "王五");
			Object obj3 = f3.get(p);
			System.out.println(obj3);
		}

	}
  • 分析:
    • 想要獲取非公有的屬性,需要加declared
    • set,get爲設置和獲取屬性的值
    • 想要使用非公有的屬性,需要調用setAccessible(true)方法

4、獲取Method

  這裏只演示公有帶參成員方法的獲取和使用

  • 示例4-1:

      package reflect;
    
      public class Person {
      	private String name;
      	private int age;
      	public int a;
      	protected int b;
      	int c;
    
      	public Person() {}
    
      	public Person(String name, int age) {
      		super();
      		this.name = name;
      		this.age = age;
      	}
    
      	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 + "]";
      	}
    
      	public void eat(String food) {
      		System.out.println(" eat " + food);
      	}
      }
      
      package reflect;
    
      import java.lang.reflect.InvocationTargetException;
      import java.lang.reflect.Method;
    
      public class TestReflectMethod {
      	public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
      		Class<Person> cls = Person.class;
    
      		Method eat = cls.getMethod("eat", String.class);
      		Person p = new Person();
      		eat.invoke(p, "饅頭");
      	}
      }
      測試結果:
       eat 饅頭
    

5、案例

  • 需求:創建任務類型的對象,執行該對象的任意無參方法

  • 分析:

    • 配置文件:配置全類名,配置方法名
    • 通過Properties讀取配置
    • 利用反射創建對象並執行方法
  • 代碼5-1:

      package reflect;
    
      public class Person {
      	private String name;
      	private int age;
      	public int a;
      	protected int b;
      	int c;
    
      	public Person() {}
    
      	public Person(String name, int age) {
      		super();
      		this.name = name;
      		this.age = age;
      	}
    
      	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 + "]";
      	}
    
      	public void eat(String food) {
      		System.out.println(" eat " + food);
      	}
    
      	public void eat() {
      		System.out.println("喫東西");
      	}
      }
      
      package reflect;
    
      import java.lang.reflect.Method;
      import java.util.Properties;
    
      public class TestReflect {
      	public static void main(String[] args) throws Exception{
      		ClassLoader cl = TestReflect.class.getClassLoader();
      		Properties prop = new Properties();
    
      		prop.load(cl.getResourceAsStream("instance.properties"));
      		String className = prop.getProperty("className");
      		String methodName = prop.getProperty("methodName");
    
      		Class cls = Class.forName(className);
      		Method method = cls.getDeclaredMethod(methodName);
      		Object obj = cls.newInstance();
      		method.invoke(obj, null);
      //		
      	}
      }
      
      instance.properties 配置文件內容:
      className=reflect.Person
      methodName=eat
      
      測試結果:
      喫東西
    

  執行帶參方法可以自己研究下,暫時沒研究。

後記

  本項目爲參考某馬視頻開發,相關視頻及配套資料可自行度娘或者聯繫本人。上面爲自己編寫的開發文檔,持續更新。歡迎交流,本人QQ:806797785

前端項目源代碼地址:https://gitee.com/gaogzhen/vue-leyou
    後端JAVA源代碼地址:https://gitee.com/gaogzhen/JAVA

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章