Java必須--高度なプロパティ反射
28661 ワード
反射メカニズムとは
プログラム実行状態では、任意のクラスまたはオブジェクトに対して、このクラスのすべての属性およびメソッド(プライベート属性およびメソッドを含む)を取得できます.この動的取得情報および動的呼び出しオブジェクトメソッドの機能を反射メカニズムと呼びます.簡単に言えば、反射により、クラスは私たちに完全に透明であり、何でも取得できます.
反射の利点
プログラムの実行中に、これらのオブジェクトを操作できます.デカップリングが可能で、プログラムの拡張性が向上
コードデモの説明
クラスを作成し、反射によってクラスを読み取り、操作します.
反射コードの例
プログラム実行状態では、任意のクラスまたはオブジェクトに対して、このクラスのすべての属性およびメソッド(プライベート属性およびメソッドを含む)を取得できます.この動的取得情報および動的呼び出しオブジェクトメソッドの機能を反射メカニズムと呼びます.簡単に言えば、反射により、クラスは私たちに完全に透明であり、何でも取得できます.
反射の利点
プログラムの実行中に、これらのオブジェクトを操作できます.デカップリングが可能で、プログラムの拡張性が向上
コードデモの説明
クラスを作成し、反射によってクラスを読み取り、操作します.
package com.yenroc.fanshe;
import java.math.BigDecimal;
public class Employee {
public String id;
String name;
protected Integer age;
private BigDecimal salary;
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public Employee(String id, String name, Integer age){
this.id = id;
this.name = name;
this.age = age;
}
// , public , new Employee()
public Employee(){
}
public void iSleep(){
System.out.println(" 。。");
}
private void iLook(){
System.out.println(" 。。");
}
@Override
public String toString() {
return "Employee [id=" + id + ", name=" + name + ", age=" + age + ", salary=" + salary + "]";
}
}
反射コードの例
package com.yenroc.fanshe;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class FansheTest {
public static void main(String[] args) throws Exception {
getIClass();// class
getIClassInfo(Employee.class);// Class [ , , ]
classField();// field
classConstructor();// newInstance
classMethod();// invoke
}
/**
* getClass: Class
*/
private static void getIClass() throws Exception {
// 1.
Class forNameClass = Class.forName("com.yenroc.fanshe.Employee");
System.out.println("forNameClass=" + forNameClass);// forNameClass=class com.yenroc.fanshe.Employee
//2.
Class className = Employee.class;
System.out.println("className=" + className);//className=class com.yenroc.fanshe.Employee
//3. instance.getClass();
Employee emp = new Employee();
Class instanceClass = emp.getClass();
System.out.println("instanceClass=" + instanceClass);// instanceClass=class com.yenroc.fanshe.Employee
System.out.println(forNameClass == className);//true
System.out.println(className == instanceClass);//true
}
/**
* Class [ , , ]
*/
private static void getIClassInfo(Class clazz) throws Exception {
Field[] publicFields = clazz.getFields();// public
Field[] allFields = clazz.getDeclaredFields();//
for (int i = 0; i < allFields.length; i++) {
//allField=java.lang.String com.yenroc.fanshe.Employee.id
//allField=public java.lang.String com.yenroc.fanshe.Employee.name
//allField=protected java.lang.Integer com.yenroc.fanshe.Employee.age
//allField=private java.math.BigDecimal com.yenroc.fanshe.Employee.salary
System.out.println("allField="+allFields[i]);
}
Constructor<?>[] publicConstrutors = clazz.getConstructors();// public
Constructor<?>[] allConstrutors = clazz.getDeclaredConstructors();//
for (int i = 0; i < allConstrutors.length; i++) {
//allConstrutor=public com.yenroc.fanshe.Employee(java.lang.String,java.lang.String)
//allConstrutor=public com.yenroc.fanshe.Employee()
System.out.println("allConstrutor="+allConstrutors[i]);
}
Method[] publicMethods = clazz.getMethods();// public
Method[] allMethods = clazz.getDeclaredMethods();//
for (int i = 0; i < allMethods.length; i++) {
//allMethod=public java.lang.String com.yenroc.fanshe.Employee.toString()
//allMethod=public void com.yenroc.fanshe.Employee.iSleep()
//allMethod=public void com.yenroc.fanshe.Employee.setSalary(java.math.BigDecimal)
//allMethod=private void com.yenroc.fanshe.Employee.iLook()
//allMethod=public java.math.BigDecimal com.yenroc.fanshe.Employee.getSalary()
System.out.println("allMethod="+allMethods[i]);
}
}
/**
* field
*/
private static void classField() throws Exception {
Class clazz = Employee.class;
Field idField = clazz.getField("id");// public
/**
* getDeclaredField name,age,salary , public ,
* set get,
* idField.setAccessible(true); ,
*/
Employee emp = new Employee();
String idValue = (String)idField.get(emp);// emp id , new , null
System.out.println("emp idValue="+ idValue);// emp idValue=null
idField.set(emp,"aaaaaa");// emp id
System.out.println(emp);// Employee [id=aaaaaa, name=null, age=null, salary=null]
}
/**
* newInstance
*/
private static void classConstructor() throws Exception {
Class clazz = Employee.class;
Constructor constructor = clazz.getConstructor();//
Object empInstance = constructor.newInstance();
System.out.println("empInstance = " + empInstance);// empInstance = Employee [id=null, name=null, age=null, salary=null]
Constructor constructor2 = clazz.getConstructor(String.class,String.class,Integer.class);// id,name,age
Object empInstance2 = constructor2.newInstance("aaa", "yenroc", 25);
System.out.println("empInstance2 = " + empInstance2);//empInstance2 = Employee [id=aaa, name=yenroc, age=25, salary=null]
}
/**
*
*/
private static void classMethod() throws Exception {
Class clazz = Employee.class;
Method iSleepMethod = clazz.getMethod("iSleep");//iLook
Employee emp = new Employee();
Object rtValue = iSleepMethod.invoke(emp);//iSleep() , rtValue null
System.out.println("rtValue="+rtValue);// 。。\r rtValue=null
}
}