目录
Constructor[] getConstructors():返回所有公共构造方法对象的数组
Constructor[] getDeclaredConstructors():返回所有构造方法对象的数
Constructor getConstructor(Class.. parameterTypes):返回单个公共构造方法对
Constructor getDeclaredConstructor(Class.. parameterTypes):返回单个构造方法对象 编辑编辑
T newInstance(Object...initargs):根据指定的构造方法创建对象
setAccessible(boolean flag):设置为true,表示取消访问检查
Field[] getFields():返回所有公共成员变量对象的数组
Field[] getDeclaredFields():返回所有成员变量对象的数组
Field getField(String name):返回单个公共成员变量对象
Field getDeclaredField(String name):返回单个成员变量对象
void set(Object obj, Object value):赋值
Method[] getMethods():返回所有公共成员方法对象的数组,包含父类中所有的公共方法
Method[] getDeclaredMethods():返回所有成员方法对象的数组,不能获取父类中的,但可以获取本类中私有的方法
Method getMethod(String name, Class.. parameterTypes):返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class.. parameterTypes):返回单个成员方法对象
什么是反射?
反射允许对封装类的字段,方法和构造函数的信息进行编程访问
获取class对象的三种方式
Class.forName("全类名");
最常用
这样就可以获取全类名
package myreflect1;
public class MyReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
Class aClass=Class.forName("myreflect1.Student");
System.out.println(aClass);
}
}
类名.class
一般更多的是当做参数进行传递
对象.getclass()
当我们已经有了这个类的对象时,才可以使用。
Class类中用于获取构造方法的方法
Student类
package myreflect1;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name) {
this.name=name;
}
protected Student(int age) {
this.age=age;
}
private Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组
package myreflect1;
import java.lang.reflect.Constructor;
public class MyReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect1.Student");
//获取构造方法
Constructor[] con = aClass.getConstructors();
for (Constructor constructor : con) {
System.out.println(constructor);
}
}
}
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数
package myreflect1;
import java.lang.reflect.Constructor;
public class MyReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect1.Student");
//获取构造方法
Constructor[] con2 = aClass.getDeclaredConstructors();
for (Constructor con : con2) {
System.out.println(con);
}
}
}
Constructor<T> getConstructor(Class<?>.. parameterTypes):返回单个公共构造方法对
Constructor<T> getDeclaredConstructor(Class<?>.. parameterTypes):返回单个构造方法对象 ![](https://img-blog.csdnimg.cn/direct/3f68a345b3f8435a9498cb738bde2a72.png)
![](https://img-blog.csdnimg.cn/direct/1fbadaacd2b240c1857e2d9e4be0eb2d.png)
Constructor类中用于创建对象的方法
T newInstance(Object...initargs):根据指定的构造方法创建对象
package myreflect1;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class MyReflectDemo1 {
public static void main(String[] args) throws InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect1.Student");
//获取构造方法
Constructor con4 = aClass.getDeclaredConstructor(String.class,int.class);
System.out.println(con4);
Student stu =(Student) con4.newInstance("张三", 18);
System.out.println(stu);
}
}
会发现报了一个这个错误
就可以用下面的这个方法解决
setAccessible(boolean flag):设置为true,表示取消访问检查
package myreflect1;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class MyReflectDemo1 {
public static void main(String[] args) throws InvocationTargetException, InstantiationException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect1.Student");
//获取构造方法
Constructor con4 = aClass.getDeclaredConstructor(String.class,int.class);
System.out.println(con4);
//表示临时取消权限校验
con4.setAccessible(true);
Student stu =(Student) con4.newInstance("张三", 18);
System.out.println(stu);
}
}
利用反射获取成员变量
Class类中用于获取成员变量的方法
Student类
package myreflect2;
public class Student {
private String name;
private int age;
public String gender;
public Student() {
}
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
/**
* 获取
* @return gender
*/
public String getGender() {
return gender;
}
/**
* 设置
* @param gender
*/
public void setGender(String gender) {
this.gender = gender;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + ", gender = " + gender + "}";
}
}
Field[] getFields():返回所有公共成员变量对象的数组
package myreflect2;
import java.lang.reflect.Field;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
Class aClass = Class.forName("myreflect2.Student");
Field[] fields = aClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
Field[] getDeclaredFields():返回所有成员变量对象的数组
Field getField(String name):返回单个公共成员变量对象
Field getDeclaredField(String name):返回单个成员变量对象
Field类中用于创建对象的方法
Object get(Object obj)获取值
package myreflect2;
import java.lang.reflect.Field;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class aClass = Class.forName("myreflect2.Student");
Field name = aClass.getDeclaredField("name");
System.out.println(name);
//获取成员变量记录的值
Student stu = new Student("zhangsan", 18, "男");
name.setAccessible(true);
Object value = name.get(stu);
System.out.println(value);
}
}
void set(Object obj, Object value):赋值
package myreflect2;
import java.lang.reflect.Field;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
Class aClass = Class.forName("myreflect2.Student");
Field name = aClass.getDeclaredField("name");
System.out.println(name);
//获取成员变量记录的值
Student stu = new Student("zhangsan", 18, "男");
name.setAccessible(true);
Object value = name.get(stu);
System.out.println(value);
name.set(stu,"lisi");
System.out.println(stu);
}
}
获取权限修饰符、成员变量的名字、成员变量的数据类型
利用反射获取成员方法
Class类中用于获取成员方法的方法
Method[] getMethods():返回所有公共成员方法对象的数组,包含父类中所有的公共方法
package myreflect3;
import java.lang.reflect.Method;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect3.Student");
//获取里面所有的方法对象(但含父类中所有的公共方法)
Method[] methods = aClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
Method[] getDeclaredMethods():返回所有成员方法对象的数组,不能获取父类中的,但可以获取本类中私有的方法
package myreflect3;
import java.lang.reflect.Method;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect3.Student");
//获取里面所有的方法对象(不会获取父类中的方法,只获取本类中的私有方法)
Method[] methods = aClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method);
}
}
}
Method getMethod(String name, Class<?>.. parameterTypes):返回单个公共成员方法对象
package myreflect3;
import java.lang.reflect.Method;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect3.Student");
Method sleep = aClass.getMethod("sleep");
System.out.println(sleep);
}
}
Method getDeclaredMethod(String name, Class<?>.. parameterTypes):返回单个成员方法对象
package myreflect3;
import java.lang.reflect.Method;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect3.Student");
//获取指定的单个方法
Method method = aClass.getDeclaredMethod("eat", String.class);
System.out.println(method);
}
}
Method类中用于创建对象的方法
Object invoke(Object obj, Object... args):运行方法
参数一:用obj对象调用该方法
参数二:调用方法的传递的参数(如果没有就不写)返回值:方法的返回值(如果没有就不写)
package myreflect3;
import myreflect2.Student;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class MyReflectDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
//获取class字节码文件对象
Class aClass = Class.forName("myreflect3.Student");
//获取指定的单个方法
Method method = aClass.getDeclaredMethod("eat", String.class);
System.out.println(method);
//方法运行
Student student = new Student();
method.setAccessible(true);
method.invoke(student,"冰淇淋");
}
}
练习
对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去
package ReflectTest;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws IOException, IllegalAccessException {
Student student = new ReflectTest.Student("张三", 18, "男", 180.0);
Teacher teacher = new Teacher("李老师", 8000);
save(student);
}
private static void save(Object obj) throws IllegalAccessException, IOException {
//获取字节码文件
Class aClass = obj.getClass();
//创建io流
BufferedWriter bw=new BufferedWriter(new FileWriter("E:\\java\\reflect\\a.txt"));
//获取成员变量
Field[] declaredFields = aClass.getDeclaredFields();
for (Field declaredField : declaredFields) {
declaredField.setAccessible(true);
//获取成员变量名字
String name = declaredField.getName();
//获取成员变量值
Object value = declaredField.get(obj);
//写出数据
bw.write(name+"="+value);
bw.newLine();
}
bw.close();
}
}
这一期就到这里啦
努力遇见更好的自己!!!