一.反射機制用來描述所有的類
Class 用來類描述類本身
Package 用來描述類所屬的包
Field 用來描述類的屬性
Method 用來描述類的方法
Constructor 用來描述類的構(gòu)造方法
Annotation 用來描述類中的注解
1.如何獲取class
三種方式:
Class clazz=class.forName("包名.類名")
Class clazz=類名.class
xx對象.getClass();object類中的方法
2.常用方法
modifiers();獲取修飾符,0代表默認不寫,1代表public 4.protected ...等等
package reflect;
3.field的常用方法
import java.lang.reflect.Field;
public class test {
public static void main(String[] args) {
try {
Class clazz=Class.forName("reflect.person");
String name=clazz.getName();//獲取類名
System.out.println(name);
String simplename=clazz.getSimpleName();
System.out.println(simplename);
Class parClazz=clazz.getSuperclass();//獲取繼承的父類
Class[] cc=clazz.getInterfaces();//獲取實現(xiàn)的接口
System.out.println(parClazz.getName());
Package p=clazz.getPackage();
p.getName();
//通過反射創(chuàng)建對象;
try {
person person=(person) clazz.getDeclaredConstructor().newInstance(); //JDK9推薦這個方法了
}catch (Exception e){
e.printStackTrace();
}
try {
Field field=clazz.getField("name");//獲取屬性
int mod=field.getModifiers();//獲取修飾符
Field[] fields=clazz.getFields();//獲取所有的屬性
Class cl=field.getType();//獲取數(shù)據(jù)類型
//如上的兩個方法,不能獲取私有的屬性,但是可以獲取繼承的屬性
Field ff=clazz.getDeclaredField("name");//獲取私有屬性
ff.setAccessible(true);//表示私有屬性可被操作
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
4.獲取類中的方法
Method m=clazz.getMethod("eat")
5.設(shè)計一個方法,傳入字符串,創(chuàng)建對象IOC(Inversion Of Control)控制反轉(zhuǎn) DI(依賴注入)自動注入
屬性,DI是IOC的一個體現(xiàn),先要有IOC;
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CreateObject {
/**
* 設(shè)計一個方法,傳入字符串,創(chuàng)建對象
* IOC思想
* DI依賴注入
*/
//是否需要參數(shù)
//是否需要返回值
public Object getBean(String className){
Object object=null;
try {
Class clazz=Class.forName(className);
//創(chuàng)建對象
object=clazz.getDeclaredConstructor().newInstance();
//這里做一個DI,自動注入屬性
//通過clazz獲取所有私有屬性---->通過屬性獲取屬性名---->通過屬性名獲取set名
Field[] fields=clazz.getFields();
for (Field field:fields) {
//獲取屬性名
String fieldName=field.getName();
//手動拼接字符串,拼接屬性對應(yīng)的set方法名,StringBuilder性能比String拼接好;
StringBuilder setMethodName=new StringBuilder("set");
setMethodName.append(fieldName.substring(0,1).toUpperCase());//屬性首字母大寫拼接
setMethodName.append(fieldName.substring(1));//其余部分拼接
//獲取field對應(yīng)的屬性類型
Class fieldType=field.getType();
//獲取set方法
Method method=clazz.getMethod(setMethodName.toString(),fieldType);
String value="";//這個是需要賦的值,是從配置文件或其他地方得來的
Constructor con=fieldType.getConstructor(String.class);//通過包裝類的String構(gòu)造方法
method.invoke(object,con.newInstance(value));//將String轉(zhuǎn)成屬性的類型
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
}