一、获取反射的三种方法
- 在源文件阶段可以用class.forName(“类的全路径”)方法获取类对象
- 在class文件阶段可以用类名.class方法获取类对象
- 在实例化对象阶段可以用对象名.getclass方法获取类对象
package com.java.demo01;
public class Test {
public static void main(String[] args) throws Exception {
//获取反射对象,person类自己根据需求创建
Class<?> clazz1 = Class.forName("com.java.demo01.Person");
Class<Person> clazz2 = Person.class;
//判断三种方式获取类对象的结果是否一致
System.out.println(clazz1 == clazz2);
System.out.println(clazz1);
System.out.println(clazz2);
Person p = new Person();
Class<? extends Person> clazz3 = p.getClass();
System.out.println(clazz2 == clazz3);
}
}
二、使用无参构造器创建一个对象
前提是自己创建一个类(类中包含字段和无参构造器)
- 使用反射的方法获取类
- 用newInstance()方法获取类的实例化对象
package com.java.demo02;
public class Test {
public static void main(String[] args) throws Exception {
//使用反射获取一个类
Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo02.Person");
//实例化对象(使用无参构造器的方式创建)
Person person = clazz.newInstance();
//获取对象中的相关信息
person.setAge(20);
person.setName("张三");
System.out.println(person);
}
}
三、获取一个类中的所有构造器与使用有参构造器获取一个实例对象
- 使用反射的方法获取类class.forName
- 用 类对象.getConstructors();方法获取类的实例化对象
package com.java.demo03;
import java.lang.reflect.Constructor;
public class Test {
public static void main(String[] args) throws Exception {
//获取源文件
Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo03.Person");
//获取所有的构造方法
Constructor<Person>[] constructors = (Constructor<Person>[]) clazz.getConstructors();
//遍历所有的构造器
for(Constructor constructor : constructors){
System.out.println(constructor);
}
}
}
四、获取类中的字段
类对象.getFiled()方法获取
五、暴力获取所有字段(包括私有字段)
字段.setAccessible(tue)
六、为一个私有字段赋值
字段.setAccessible(tue)将私有字段暴力破解成公开的即可用set方法赋值
package com.java.demo07;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws Exception {
//获取源文件
Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo07.Person");
//使用无参构造方法实例化一个对象
Person person = clazz.newInstance();
person.setName("张三");
System.out.println("改变私有字段之前的值:" + person.getName());
//暴力获取私有字段(包括公有字段)
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); //类似于把私有权限公开了
field.set(person,"李四");
System.out.println("改变私有字段之后的值:" + person.getName());
}
}
七、获取类中所有的公开的方法
类对象.getMethods()方法,返回的值是一个数组
package com.java.demo08;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
//获取源文件
Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo08.Person");
//获取类中的所有公开的方法(包括父类中的所有公开的方法)
Method[] methods = clazz.getMethods();
for(Method method : methods){
System.out.println(method);
}
}
}
八、获取类中所有的方法(包括私有方法)
类对象.getDeclaredMethods();
九、方法的调用
a.invoke(对象名b,参数c),a代表方法名,b代表实例化对象的名称,c代表要传输的参数,没有参数可以无视。
没有使用反射时正常方法的调用时b.a©。
package com.java.demo10;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
//获取源文件
Class<Person> clazz = (Class<Person>) Class.forName("com.java.demo10.Person");
//获取类的实例对象
Person person = clazz.newInstance();
Method m = clazz.getMethod("eat", String.class);
//使用反射调用方法
m.invoke(person,"饭");
}
}
十、获取某个继承了哪些类
对象名.getsuperclass()可以查看父类的类对象
新手上路,有不对的地方可以留言