一.反射获取对象
1.获取字节码文件的三种方式
Class.forName("类的全路径")
对象.getClass()
类名.class
2.获取构造方法的api
Class clazz=Student.class;
Constructor c = clazz.getDeclaredConstructor(boolean.class);//获取某个指定的构造方法(包括私有构造)
Constructor[] constructors = clazz.getDeclaredConstructors();//获取所有的构造方法(包括私有构造)
Constructor[] constructors2 = clazz.getConstructors();//获取所有的构造方法(不包括私有构造)
Constructor constructor = clazz.getConstructor(null);//获取某个指定的构造方法(不包括私有构造)
<span style="white-space:pre"> </span>//如果是无参构造的话,参数可以给null,或者不给<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
Constructor c = clazz.getDeclaredConstructor();
Constructor constructor = clazz.getConstructor();
3.构造方法调用newInstance(Object....obj),来获取到对象实例
c.setAccessible(true);//若果获取到的是private的构造,需要暴力反射设置为true
c.newInstance(true)<span style="font-family: Arial, Helvetica, sans-serif;">;//clazz..newInstance()默认调用的是类中的无参构造来获取实例对象的</span>
public class Demo2Method {
/*
* 与操作方法相关的方法:
* Method getMethod(String name, Class<?>... parameterTypes) 第一个参数:方法,第二个参数:参数类型或个数。
* 得到指定的公共方法。
Method[] getMethods() 返回一个包含某些 Method 对象的数组,得到所有公共方法(包括父类或父接口的公共方法)。
Method getDeclaredMethod(String name, Class<?>... parameterTypes)
得到指定的方法。
Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
Method对象的方法:
Object invoke(Object obj, Object... args) //此方法代表要执行的方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
* */
@Test //public void m1()
public void test1() throws Exception{
//Student stu = new Student();
Class clazz = Student.class;
Method m = clazz.getMethod("m1");
m.invoke(clazz.newInstance(), null); //此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
}
@Test //public void m2(String name)
public void test2() throws Exception{
Class clazz = Student.class;
Method m = clazz.getMethod("m2",String.class);
m.invoke(clazz.newInstance(), "tom"); //此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
}
@Test //public String m3(String name){
public void test3() throws Exception{
Class clazz = Student.class;
Method m = clazz.getMethod("m3",String.class);
Object o = m.invoke(clazz.newInstance(), "tom"); //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
System.out.println(o);
}
@Test //private void m4(int age)
public void test4() throws Exception{
Class clazz = Student.class;
Method m = clazz.getDeclaredMethod("m4",int.class);
m.setAccessible(true);
m.invoke(clazz.newInstance(), 18); //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
}
@Test //public static void m5(String name,int age)
public void test5() throws Exception{
Class clazz = Student.class;
Method m = clazz.getMethod("m5",String.class,int.class);
m.invoke(null, "tom",18); //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
}
@Test //public static void m6(String[] args){
public void test6() throws Exception{
Class clazz = Student.class;
Method m = clazz.getMethod("m6",String[].class);
//m.invoke(null,new Object[]{new String[]{"tom","jerry","aaa"}}); //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
m.invoke(null,(Object)new String[]{"tom","jerry","aaa"});
}
@Test //提到所有方法
public void test7() throws Exception{
Class clazz = Student.class;
Method[] ms = clazz.getMethods();//得到所有公共的方法
System.out.println(ms.length);
}
@Test //提到所有方法
public void test8() throws Exception{
Class clazz = Student.class;
Method[] ms = clazz.getDeclaredMethods();//得到当前类所有方法
System.out.println(ms.length);
}
}
public class Demo3Field {
/*
* Field getField(String name)
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。
Field[] getFields()
返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。
Field getDeclaredField(String name)
返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
Field[] getDeclaredFields()
返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
Field对象的方法:
Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。
void set(Object obj, Object value) 给第一个参数所表示的对象,赋值(第二个参数)
* */
@Test //给操作公共变量name
public void test1() throws Exception{
Student stu = new Student();
Class clazz = Student.class;
Field f = clazz.getField("name");
System.out.println(f.get(stu));
f.set(stu, "李四");
Field f1 = clazz.getField("name");
System.out.println(f1.get(stu));
}
@Test //给操作私有变量age
public void test2() throws Exception{
Student stu = new Student();
Class clazz = Student.class;
Field f = clazz.getDeclaredField("age");
f.setAccessible(true);
f.set(stu,18);
/*Field f1 = clazz.getDeclaredField("age");
f1.setAccessible(true);*/
System.out.println(f.get(stu));
}
@Test //给操作私有变量age
public void test3() throws Exception{
Student stu = new Student();
Class clazz = Student.class;
//Field f = clazz.getDeclaredField("name");
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs) {
System.out.println(Modifier.toString(f.getModifiers())+"\t"+f.getType().getSimpleName()+"\t"+ f.getName());
}
}
}