反射
动态编译
测试脚本引擎rhino
可以进行对内容的修改操作
字节码操作类库
javassist
https://blog.csdn.net/HC199854/article/details/107252867
反射reflect
- 对象.getName() 获得包名加类名
- getSimpleName 获得类名
- getFields() 只能找到public属性
- getDeclaredField 能找到所有的属性
- getMethods() 获得本类极其父类的全部public方法
- getDeclaredMethods 获得本类的所有方法
- getMethod 需要给他一个方法类型的参数 获得指定的方法
- getConstructors 获取构造器
- 带generic的
- getAnnotations
newInstance方法创建一个对象
先获取class的对象实例 Class clz = Class.forname();
根据对象实例获取构造器 Constructor c = clz.getConstructor();
通过构造器对象newInstance 方法获取反射对象 Object o = c.instance();
获取方法的method对象:Method m=clz.getMethod(" ",int class);
利用invoke方法调用方法: m.invoke(); 将方法参数化
-
通过反射创建一个属性
User user = (User)c1.newInstance(); Field name = c1.getDeclaredField('name'); //不能直接操作私有属性 name.setAccessible(true);//关闭程序的安全检测 name.set(user,"fanshuai"); System.out.println(user4.getName());
获取当前时间:System.currentTimeMillis();
当获取很多次对象时,性能:普通方式>>关闭检测的反射>反射 关闭检测时开启时的4倍左右
ORM
反射操作注解
@Tablekuang("db_student")
class Student{
@Fieldkuang(columnName = "db_id",type = "int",length = 10)
private int id;
@Fieldkuang(columnName = "db_age",type = "int",length = 10)
private int age;
@Fieldkuang(columnName = "db_name",type = "varchar",length = 10)
private String name;
有参无参tostring方法
}
//类的注解
@Targer(ElementType.TYPE) //设定注解作用类型
@Retention(RetentionPolicy.RUNTIME) //设定注解作用级别
@interface Tablekuang{
String value();
}
//属性的注解
@Targer(ElementType.FIELD) //设定注解作用类型
@Retention(RetentionPolicy.RUNTIME) //设定注解作用级别
@interface Fieldkuang{
String columnName();
String type();
int length();
}