反射的一些方法
此处我创建了一个fanshe类,用来提供一些基本的成员变量、成员方法,为后面的测试做准备,在此处没有表述出来,此文章里的代码部分均为测试类的代码。
//2.通过单元测试方法获取类的字节码文件
@Test
public void getclazz() throws ClassNotFoundException {
Class<?> cl1 = Class.forName("fansheLearn.fansheTest");//包名.类名
Class<?> cl2= fansheTest.class;
Class<? extends fansheTest> cl3= new fansheTest().getClass();
System.out.println(cl1);//class fansheLearn.fansheTest
System.out.println(cl2.getName());//fansheLearn.fansheTest 全路径名
System.out.println(cl3.getSimpleName());//fansheTest 类名
System.out.println(cl1.getPackage());//package fansheLearn对象
System.out.println(cl1.getPackage().getName());//fansheLearn包名
如何获取类的方法
说明:第一句获取字节码对象是前提,必须要有。
getMethods()是获取所有的方法,不是用getMethod()
m.getParameterTypes();是获取参数的
Class<?> c1 = Class.forName("fansheLearn.fanshe");
Method[] ms=c1.getMethods();
System.out.println(Arrays.toString(ms));
for (Method m:ms
) {
System.out.println(m.getName());
Class<?>[] types= m.getParameterTypes();
System.out.println(Arrays.toString(types));
System.out.println();
}
获取构造方法
Constructor<?>[] constructors = c1.getConstructors();
for (Constructor c:constructors
) {
System.out.println(c.getName());
Class[] parameterTypes = c.getParameterTypes();
System.out.println(Arrays.toString(parameterTypes));
}
System.out.println("____________________________________________");
//成员变量的修饰符必须是public才可以,默认修饰符都是不可以的
Field[] fields = c1.getFields();
for (Field f:fields
) {
System.out.println(f);
System.out.println(f.getName());
System.out.println(f.getType());
}
获取成员变量
说明:成员变量的修饰符必须是public才可以,默认修饰符都是不可以的
//成员变量的修饰符必须是public才可以,默认修饰符都是不可以的
Field[] fields = c1.getFields();
for (Field f:fields
) {
System.out.println(f);
System.out.println(f.getName());
System.out.println(f.getType());
}
反射创建对象
方法一:通过触发目标类的无参构造创建对象
方法二:通过触发目标类的全参构造创建对象
Class<?> cl=fanshe.class;
//反射创建对象方案一
Object o = cl.newInstance();
System.out.println(o);
//反射创建对象方案二
Constructor<?> constructor = cl.getConstructor(String.class,int.class);
Object o1 = constructor.newInstance("萍萍", 6);
System.out.println(o1);
暴力反射
说明:此处代码是给baolifanshe这个类的成员变量设置值,并且name是私有的
name.setAccessible(true); 暴力反射,需要设置私有可见权限
@Test
public void getField() throws Exception {
Class <?> cl=baolifnashe.class;
Field name = cl.getDeclaredField("name");
//name.setAccessible(true); 暴力反射,需要设置私有可见权限
name.setAccessible(true);
System.out.println(name);
System.out.println(name.getType());
System.out.println(name.getType().getName());
Object o = cl.newInstance();
//set(m,n)m是给哪个对象的name属性设置值,n是设置的值是什么
name.set(o,"余生请多指教");
System.out.println(name.get(o));//余生请多指教
}