1.自定义一个注解
/**自定义注解
* @Retention 描述注解何时有效
* @Target 描述注解可以修饰哪些对象
* */
@Retention(RetentionPolicy.RUNTIME)//RUNTIME表示运行时有效
@Target(ElementType.TYPE)//type表示注解只能描述类
@interface Entity{//元数据(描述数据)
//属性定义
String value() default "";
}//所有注解默认继承Annotation
构建测试类 利用反射获取注解上面的信息
// 1.通过反射构建Pool类的对象
Class<Pool> cls = Pool.class;
Pool p = cls.newInstance();
System.out.println(p);
// 2. 通过反射为Pool对象的coreSize属性赋值
Field f = cls.getDeclaredField("coreSize");
System.out.println(f);
// 3.通过反射得到注解
Value fv = f.getDeclaredAnnotation(Value.class);
f.setAccessible(true);//设置私有方法可见
f.set(p, fv.value());//给对象方法可访问
System.out.println(p.getCoreSize());
2.基于字节码对象 反射 创建工厂方法 创建对象
package com.java.reflect;
import java.lang.reflect.Constructor;
//对象工厂(负责基于字节码对象创建类的实例对象)
public class ObjectFactory {
public static <T> T newInstance(Class<T> cls) throws Exception {
return newInstance(cls, null, null);
}
/**
* 创建对象
* @param cls 类的字节码对象
* @param parameterTypes 参数类型
* @param args 实际参数的值
* @return 对象实例
* @throws Exception
*/
public static <T> T newInstance(Class<T> cls,
Class<?>[] parameterTypes,
Object[] args) throws Exception {
// 1.获取类中的构造方法对象
Constructor<T> con = cls.getDeclaredConstructor(parameterTypes);
// 2.设置构造方法可访问
if (!con.isAccessible())
con.setAccessible(true);
// 3.基于构造方法对象构建类的实例对象
return con.newInstance(args);
}
}