一.反射机制用来描述所有的类
Class 用来类描述类本身
Package 用来描述类所属的包
Field 用来描述类的属性
Method 用来描述类的方法
Constructor 用来描述类的构造方法
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();//获取实现的接口
System.out.println(parClazz.getName());
Package p=clazz.getPackage();
p.getName();
//通过反射创建对象;
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();//获取数据类型
//如上的两个方法,不能获取私有的属性,但是可以获取继承的属性
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.设计一个方法,传入字符串,创建对象IOC(Inversion Of Control)控制反转 DI(依赖注入)自动注入
属性,DI是IOC的一个体现,先要有IOC;
package reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class CreateObject {
/**
* 设计一个方法,传入字符串,创建对象
* IOC思想
* DI依赖注入
*/
//是否需要参数
//是否需要返回值
public Object getBean(String className){
Object object=null;
try {
Class clazz=Class.forName(className);
//创建对象
object=clazz.getDeclaredConstructor().newInstance();
//这里做一个DI,自动注入属性
//通过clazz获取所有私有属性---->通过属性获取属性名---->通过属性名获取set名
Field[] fields=clazz.getFields();
for (Field field:fields) {
//获取属性名
String fieldName=field.getName();
//手动拼接字符串,拼接属性对应的set方法名,StringBuilder性能比String拼接好;
StringBuilder setMethodName=new StringBuilder("set");
setMethodName.append(fieldName.substring(0,1).toUpperCase());//属性首字母大写拼接
setMethodName.append(fieldName.substring(1));//其余部分拼接
//获取field对应的属性类型
Class fieldType=field.getType();
//获取set方法
Method method=clazz.getMethod(setMethodName.toString(),fieldType);
String value="";//这个是需要赋的值,是从配置文件或其他地方得来的
Constructor con=fieldType.getConstructor(String.class);//通过包装类的String构造方法
method.invoke(object,con.newInstance(value));//将String转成属性的类型
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
}
网友评论