反射
@MyAnnotation(value = "Student-Value",key = "Student-Code")
public class Student {
private Integer id;
String name;
protected Integer age;
public String address;
public Student() {
}
private Student(Integer id) {
this.id = id;
}
public Student(Integer id, String name) {
this.id = id;
this.name = name;
}
public Student(Integer id, String name, Integer age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
private void show1(){
System.out.println("方法show1正在执行");
}
void show2(){
System.out.println("方法show2正在执行");
}
protected void show3(){
System.out.println("方法show3正在执行");
}
public void show4(){
System.out.println("方法show4正在执行");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "";
String key() default "code";
}
1,获取类对象
Class<?> clazz = Class.forName("chapter02.Student")
clazz = Student.class
clazz = new Student().getClass()
2,获取构造器
//获取实例
Object instance = clazz.newInstance()
//获取构造器
//获取所有的构造器
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
System.out.println("构造器:" + Arrays.toString(constructors));
//构造器:[public chapter02.Student(java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.String), public chapter02.Student(java.lang.Integer,java.lang.String), private chapter02.Student(java.lang.Integer), public chapter02.Student()]
//获取public修饰的构造器
constructors = clazz.getConstructors();
System.out.println("构造器:" + Arrays.toString(constructors));
//构造器:[public chapter02.Student(java.lang.Integer,java.lang.String,java.lang.Integer,java.lang.String), public chapter02.Student(java.lang.Integer,java.lang.String), public chapter02.Student()]
//获取指定参数的构造器
Constructor<?> constructor = clazz.getDeclaredConstructor(Integer.class);
System.out.println("构造器:" + constructor);
//构造器:private chapter02.Student(java.lang.Integer)
3,获取属性
//获取属性
//获取所有的属性
Field[] fields = clazz.getDeclaredFields()
System.out.println("属性:" + Arrays.toString(fields))
//属性:[private java.lang.Integer chapter02.Student.id, java.lang.String chapter02.Student.name, protected java.lang.Integer chapter02.Student.age, public java.lang.String chapter02.Student.address]
//获取public修饰的属性
fields = clazz.getFields()
System.out.println("属性:" + Arrays.toString(fields))
//属性:[public java.lang.String chapter02.Student.address]
//获取指定类型的参数的属性,并且赋值
Field name = clazz.getDeclaredField("name")
name.set(instance,"Mia")
Object o = name.get(instance)
System.out.println(o)
//Mia
4,获取方法
//获取方法
//获取所有的方法
Method[] methods = clazz.getDeclaredMethods();
System.out.println("方法:" + Arrays.toString(methods));
//方法:[public java.lang.String chapter02.Student.getAddress(), public java.lang.String chapter02.Student.getName(), public java.lang.Integer chapter02.Student.getId(), public void chapter02.Student.setName(java.lang.String), public void chapter02.Student.setAddress(java.lang.String), private void chapter02.Student.show1(), void chapter02.Student.show2(), protected void chapter02.Student.show3(), public void chapter02.Student.show4(), public java.lang.Integer chapter02.Student.getAge(), public void chapter02.Student.setAge(java.lang.Integer), public void chapter02.Student.setId(java.lang.Integer)]
//获取public修饰的方法
methods = clazz.getMethods();
System.out.println("方法:" + Arrays.toString(methods));
//方法:[public java.lang.String chapter02.Student.getAddress(), public java.lang.String chapter02.Student.getName(), public java.lang.Integer chapter02.Student.getId(), public void chapter02.Student.setName(java.lang.String), public void chapter02.Student.setAddress(java.lang.String), public void chapter02.Student.show4(), public java.lang.Integer chapter02.Student.getAge(), public void chapter02.Student.setAge(java.lang.Integer), public void chapter02.Student.setId(java.lang.Integer), public final void java.lang.Object.wait() throws java.lang.InterruptedException, public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException, public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException, public boolean java.lang.Object.equals(java.lang.Object), public java.lang.String java.lang.Object.toString(), public native int java.lang.Object.hashCode(), public final native java.lang.Class java.lang.Object.getClass(), public final native void java.lang.Object.notify(), public final native void java.lang.Object.notifyAll()]
//调用方法
Method method = clazz.getDeclaredMethod("show4");
method.invoke(instance);
//方法show4正在执行
5,获取注解
//获取注解
Annotation[] annotations = clazz.getAnnotations()
System.out.println("注解:" + Arrays.toString(annotations))
//注解:[@chapter02.MyAnnotation(value=Student-Value, key=Student-Code)]
6,动态代理
interface Subject {
void request();
}
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject中的request方法正在执行");
}
}
class ProxyHandler implements InvocationHandler {
private final Object target;
public ProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method call");
Object result = method.invoke(target, args);
System.out.println("After method call");
return result;
}
}
public static void main(String[] args) throws Exception {
RealSubject realSubject = new RealSubject();
ProxyHandler handler = new ProxyHandler(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(
Subject.class.getClassLoader(),
new Class<?>[]{Subject.class},
handler
);
proxySubject.request();
}