Java代码的三个阶段
注解与反射
注解
@Target({ElementType.TYPE,ElementType.METHOD})//表示注解的作用域
@Retention(RetentionPolicy.RUNTIME)//什么时候生效
@Documented//表示方法已经过时,但是还能用
@Inherited//表示子类可以继承
public @interface MyAnnotation {
String value() default "";
}
反射
一个类只有一个class对象
类被加载后,类的整个结构都被封装在class对象中
获取反射对象
-
通过路径
Class<?> c1 = Class.forName("com.smu.User");
- 通过对象获取
Class<? extends User> aClass = user.getClass();
- 通过类名获取
Class<User> userClass = User.class;
- 基本内置对象的封装类都有的TYPE属性
Class<Integer> type = Integer.TYPE;
通过反射获取类的信息
获取类名
- String name = c1.getName();
- String simpleName = c1.getSimpleName();
获取字段(带有Declared的是获取包括private的字段)
- Field[] fields = c1.getFields();
- Field username = c1.getField("username");
- Field[] declaredFields = c1.getDeclaredFields();
- Field username1 = c1.getDeclaredField("username");
获取方法(不带Declared是获取本类以及父类的public方法,带有Declared的是获得本类的所有包括private的方法)
- Method[] methods = c1.getMethods();
- Method getAge = c1.getMethod("getAge");
- Method[] declaredMethods = c1.getDeclaredMethods();
- Method setPassword = c1.getDeclaredMethod("setPassword", String.class);
获取构造器
- Constructor<?>[] constructors = c1.getConstructors();
- Constructor<?>[] declaredConstructors = c1.getDeclaredConstructors();
- Constructor<?> declaredConstructor1 = c1.getDeclaredConstructor(String.class, String.class, Integer.class);
获取对象
通过class对象获取(需要有无参构造器,需要是public修饰的),通过构造器获取,如果是private修饰的需要setAccessible(true);
- User o = (User) c1.newInstance();
- o.setAge(12);
- System.out.println("class对象获取"+o);
- Constructor<?> declaredConstructor = c1.getDeclaredConstructor(String.class, String.class, Integer.class);
- declaredConstructor.setAccessible(true);
- User happy = (User) declaredConstructor.newInstance("happy", "889886", 21);
- System.out.println("通过构造器获取"+happy);
执行方法
可以通过类对象调用私有方法,也可以直接通过class对象获取方法
- Constructor<?> declaredConstructor = c1.getDeclaredConstructor(String.class, String.class, Integer.class);
- declaredConstructor.setAccessible(true);
- Object happy1 = declaredConstructor.newInstance("happy", "889886", 15);
- Method setUsername = c1.getDeclaredMethod("setUsername", String.class);
- setUsername.invoke(happy1, "sjjshj");