Java反射是JAVA的一个bug级的存在
我们可以利用java反射去获取任何字段、任何类。
包括私有的。
获取类模板的两种方式
一
Class<Blog> blogClass =Blog.class;
二
Blog blog =new Blog();
Class<? extends Blog> blogclass1 =blog.getClass();
这样我们就可以利用类模板进行操作了:
我们可以利用blogclass 或者blogclass1来操作
System.out.println(blogClass.getName());
私有方法用getDeclaredField,非私有字段用getFileld
System.out.println(blogClass.getDeclaredField("id"));
操作私有字段,修改值
Field blog_id=blogClass.getDeclaredField("id");
//因为是私有,需要加上这个
blog_id.setAccessible(true);
blog_id.set(blog,1L);
获取这个字段的注解(注解有三种生命周期:source class Runtime)
blog_id.getAnnotation(注解名.class);
获取该对象的这个一值
blog_id.get(blog);
获取构造器
Constructor<?>[] declaredConstructors=blogClass.getDeclaredConstructors();
for (Constructor<?> declaredConstructor : declaredConstructors) {
System.out.println("declaredConstructor = " + declaredConstructor);
}
获取无参构造器,并新生成一个对象o
if(declaredConstructor.getParameterCount()==0){
System.out.println("declaredConstructor = " + declaredConstructor);
Object o =declaredConstructor.newInstance();
}
注意获取的对象是Object 类型,需要强转
Object o =declaredConstructor.newInstance();
//强转一下
Blog o1=((Blog) o);
获取方法,并执行方法(参数是对象名)
Method tagsToIds = blogClass.getDeclaredMethod("tagsToIds");
tagsToIds.invoke(blog);