User.class
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
// @JsonProperty("pId")
private Long userId;
private String name;
private void say(String word){
System.out.println("Hello" + word);
}
private void say(String word, Long l){
System.out.println("Hello" + word + l);
}
}
测试
@Test
void reflectionTest() throws Exception {
User user = new User();
user.setName("张三");
user.setUserId(1L);
/**
* 获取反射对象的三种方式
*/
Class class1 = User.class;
Class<?> class2 = Class.forName("com.zyy.entity.User");
Class<? extends User> class3 = user.getClass();
/**
* 反射方法
*/
Method say = class1.getDeclaredMethod("say", new Class[]{String.class,Long.class});
say.setAccessible(true);
say.invoke(user, new Object[]{"world",3000L});
for (Method method : class2.getDeclaredMethods()) {
if (method.getName().equals("say")) {
method.setAccessible(true);
Object invoke = method.invoke(user, "你好");
}
}
/**
* 反射属性
*/
Field id = class1.getDeclaredField("userId");
id.setAccessible(true);
id.set(user, 2L);
System.out.println(id.get(user));
}
Tips:
- isAccessible(): isAccessible()值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
实际上setAccessible是启用和禁用访问安全检查的开关,并不是为true就能访问为false就不能访问
由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的【private属性和方法只有isAccessible()设置true,才能进行操作】