一.java反射概念

在运行过程中, 也就是我们的类在硬盘上存储着,在运行的时候加载到内存中, 会为我们Class类的对象, 来表示Car类的信息, 其中可以提供多种方法来访问Car中的信息
二.为什么使用反射机制
之前我们创建对象都是通过最简单的 new Car();的方式来创建
1. 先定义一个类 Car
2. 后创建对象,使用对象
这是正常的使用,已知某个类,创建该类的对象. 正向使用. 但是这种写法,把代码直接写死了,不能变了,固定了
而框架需要为我们处理不同的类,我们配置什么类,它都需要能够创建,new这种方式显然是不能满足的,所以我们引入反射机制为框架提供更好的应用环境
三.java反射API
四.三种获得类的Class类的方法
Class c1 = User.class;
System.out.println(c1);
Class c2 = new User().getClass();
System.out.println(c2);
Class c3 = Class.forName("com.ffyc.javareflect.model.User");
//这里可以随意传入任意类
注意: 反射的起点就是获得该类的class对象,在通过class对象,获取类的信息 无论类创建了多少个当对象,该类的class对象只有一个
1.获得Constructor类实例
String forname ="com.ffyc.javareflect.model.User"; Class c1 = Class.forName(forname); Object b = c1.newInstance();//class类中c1.newInstance(); 也是创建对象的一种方式
(1)获取类中公共指定的构造方法,用Constructor类的对象来表示获取方法的信息
Constructor constructor = c1.getConstructor();
Object b1 = constructor.newInstance();
Constructor constructor1 = c1.getConstructor(int.class,String.class,String.class);
constructor1.getParameters();//获取参数类型
(2)获取类中指定的构造方法(包含私有的)
Constructor constructor2 = c1.getDeclaredConstructor(int.class,String.class,String.class);
constructor2.setAccessible(true);//开启权限
constructor2.newInstance(1,"jim","123");
(3)获取所有的构造方法
Constructor[] constructor3 = c1.getDeclaredConstructors();
String forname ="com.ffyc.javareflect.model.User"; Class c = Class.forName(forname); Object b = c.newInstance();
//获取类中所有的属性
Field[] field = c.getDeclaredFields();
for (Field field1 : field){//一个field代表当前循环到该对象的一个属性
//field1.getName();//获取属性的名字
//field1.setAccessible(true);//开启权限
//field1.set(b,111);//给属性赋值
//通过反射机制获得类中的方法
String name = "set"+ field1.getName().substring(0,1).toUpperCase()+field1.getName().substring(1);//获取set方法
Method method = c.getMethod(name,field1.getType());
method.invoke(b,1111);
}
我们一般给类中的属性赋值都是通过get, set 方法,通过拼接字符串得到set方法的名字,从而获得对应的属性的set方法给属性赋值
Method类的作用:
五.反射案例(转json)
public class Myjson {
public static String tojson(Object obj) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class c = obj.getClass();
String json = "{";
Field[] fields = c.getDeclaredFields();
for (Field field : fields){
String name = field.getName();
json+=name+":";
Method method = c.getMethod("get"+ name.substring(0,1).toUpperCase()+name.substring(1));
Object value = method.invoke(obj);
json+=value+",";
}
json=json.substring(0,json.length()-1);
json+="}";
return json;
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
User user = new User();
user.setAccount("admin");
user.setPassword("111");
System.out.println( tojson(user));
}
}
这样我们传入任意的类,都会将类中的信息转为json格式
六.反射的优缺点
1.优点
1.增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作