实体
package com.youshang.demo.model;
import com.youshang.demo.annotation.PersonAnnotation;
/**
* @author youshang
*/
public class PersonModel {
private Integer a;
public PersonModel(String name) {
System.out.println(name);
}
@PersonAnnotation(name = "xxx")
private void echo(String name) {
System.out.println("hello +" + name);
}
}
自定义注解
package com.youshang.demo.annotation;
import java.lang.annotation.*;
/**
* @author youshang
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PersonAnnotation {
String name() default "张三";
}
测试方法
package com.youshang.demo.spring.annotation;
import com.youshang.demo.annotation.PersonAnnotation;
import com.youshang.demo.model.PersonModel;
import org.junit.Test;
import org.springframework.util.StringUtils;
import java.lang.reflect.*;
public class ReflectionTest {
/**
* 通过类对象获取指定方法的注解,对其方法进行调用和修改参数
* @param args
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InstantiationException
* @throws InvocationTargetException
*/
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
Class<?> personClass = Class.forName(PersonModel.class.getName());
Object person = personClass.getConstructor(String.class).newInstance("123");
// Object person = personClass.newInstance();
Method method = personClass.getDeclaredMethod("echo",String.class);
PersonAnnotation declaredAnnotation = method.getDeclaredAnnotation(PersonAnnotation.class);
String name = declaredAnnotation.name();
method.setAccessible(true);
if (!StringUtils.isEmpty(name)) {
method.invoke(person, name);
}else {
method.invoke(person, "hello");
}
}
/**
* 获取有参构造方法
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws InstantiationException
*/
@Test
public void constructionTest() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> personClass = Class.forName(PersonModel.class.getName());
Constructor<?> constructor = personClass.getConstructor(String.class);
Object zs = constructor.newInstance("zs");
}
/**
* 通过类对象对当前的类属性进行单独的处理
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws IllegalAccessException
* @throws InvocationTargetException
* @throws InstantiationException
* @throws NoSuchFieldException
*/
@Test
public void parameterTest() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class<?> personClass = Class.forName(PersonModel.class.getName());
Constructor<?> constructor = personClass.getConstructor(String.class);
Object zs = constructor.newInstance("zs");
Field a = personClass.getDeclaredField("a");
a.setAccessible(true);
a.set(zs,112);
System.out.println(a.get(zs));
}
/**
* 通过类对象获取当前所在的package路径
* @throws ClassNotFoundException
*/
@Test
public void packageTest() throws ClassNotFoundException {
Class<?> personClass = Class.forName(PersonModel.class.getName());
System.out.println(personClass.getPackage().getName());
}
}