Java教程 反射

Java教程 反射
在Java中关于放射的相关描述:
1、反射就是通过Java类的各种成分(构造函数、成员属性、成员方法等)映射成一个个的Java对象。
反射相关的使用:
一、通过反射获取Class 类对象:
1、通过getClass(); 进行获取。
2、通过任意的数据类型进行获取Class 类
3、通过forName(String className); 进行获取
通过反射进行获取Class 类对象的实例:
package com.liuguangfa.fanshe; /** * 反射的运用 * * @author Liu_Xiansheng * */ public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /** * main方法 * * @throws ClassNotFoundException */ public static void main(String[] args) throws ClassNotFoundException { // 通过Object.Class 进行获取类对象 Class c1 = Student.class; // 通过实例化的对象进行获取类对象 Student student = new Student(); Class c2 = student.getClass(); // 通过forName(String className); 进行获取类对象 Class c3 = Class.forName("com.liuguangfa.fanshe.Student"); System.out.println(c1 == c2); System.out.println(c2 == c3); } }
Java控制台的输出结果为:
true
true
二、通过反射获取构造方法并且使用:
运用相关类:Constructor 类
调用构造函数的方法:newInstance();
获取构造方法:
1、批量获取所有的公有构造函数:
clazz.getConstructors();
2、批量获取所有的公有的、私有的构造函数:
clazz.getDeclaredConstructor();
3、获取公有的构造函数并且调用的方式:
clazz.getConstructor();
调用公有的构造函数的方法:
clazz.getConstructor().newInstance();
4、获取私有的构造函数并且调用的方式:
clazz.getConstructor();
调用私有的构造函数的方法(获取使用权限):
clazz.getConstructor().setAccessible(teue);
clazz.getConstructor().newInstance();
//通过电泳构造函数创建对象时,需要通过调用.getConstructor(); 方法的时候,里面填写构造函数类型,如:
String.class,创建新对象的时候.newInstance(); ,里面填写null,或者时对应的类型。
package com.liuguangfa.fanshe; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; /** * 反射的运用 * * @author Liu_Xiansheng * */ public class Student { private String name; private int age; private boolean isGood; // 创建不同类型的构造器 public Student() { System.out.println("调用的公有、无参数构造器"); } public Student(String name) { System.out.println("调用公有 String 类型的name :" + name); } public Student(int age) { System.out.println("调用公有 int 类型的age :" + age); } public Student(String name, int age) { System.out.println("调用公有 Sting 类型的name " + name + ",int 类型的age :" + age); } private Student(boolean isGood) { System.out.println("调用私用 boolean :" + isGood); } /** * main方法 * * @throws ClassNotFoundException * @throws SecurityException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // 创建Class对象 Class clazz = Class.forName("com.liuguangfa.fanshe.Student"); // 获取所有公有的构造函数 System.out.println("***调用所有的公有的构造函数"); Constructor[] conArrays = clazz.getConstructors(); for (Constructor e : conArrays) { System.out.println(e); } // 获取所有公有私有默认受保护的构造函数 System.out.println("***调用公有的、私有的构造函数"); conArrays = clazz.getDeclaredConstructors(); for (Constructor e : conArrays) { System.out.println(e); } // 调用公有、无参数的构造器 System.out.println("***调用公有的、无参的构造函数"); Constructor con = clazz.getConstructor(null); System.out.println(con); // 调用公有的、有参数的构造器,这里以String 类型的name,并调用 System.out.println("***调用公有的、String类型构造函数"); con = clazz.getConstructor(String.class); System.out.println(con); // 调用函数 Object obj = con.newInstance("张三"); Student stu = (Student) obj; System.out.println(stu); // 调用私有的构造器,并调用 System.out.println("***调用私有的造函数"); con = clazz.getDeclaredConstructor(boolean.class); System.out.println(con); // 调用函数 con.setAccessible(true); obj = con.newInstance(true); stu = (Student) obj; System.out.println(stu); } }
Java控制台的输出:
***调用所有的公有的构造函数 public com.liuguangfa.fanshe.Student(java.lang.String,int) public com.liuguangfa.fanshe.Student(int) public com.liuguangfa.fanshe.Student(java.lang.String) public com.liuguangfa.fanshe.Student() ***调用公有的、私有的构造函数 private com.liuguangfa.fanshe.Student(boolean) public com.liuguangfa.fanshe.Student(java.lang.String,int) public com.liuguangfa.fanshe.Student(int) public com.liuguangfa.fanshe.Student(java.lang.String) public com.liuguangfa.fanshe.Student() ***调用公有的、无参的构造函数 public com.liuguangfa.fanshe.Student() ***调用公有的、String类型构造函数 public com.liuguangfa.fanshe.Student(java.lang.String) 调用公有 String 类型的name :张三 com.liuguangfa.fanshe.Student@72ea2f77 ***调用私有的造函数 private com.liuguangfa.fanshe.Student(boolean) 调用私用 boolean :true com.liuguangfa.fanshe.Student@33c7353a
三、通过反射获取成员变量并调用
获取成员属性的类:Field 类
package com.liuguangfa.fanshe; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; /** * 反射的运用 * * @author Liu_Xiansheng * */ public class Student { public String name; private int age; // 创建不同类型的构造器 public Student() { System.out.println("调用的公有、无参数构造器"); } public Student(String name) { System.out.println("调用公有 String 类型的name :" + name); } public Student(int age) { System.out.println("调用公有 int 类型的age :" + age); } public Student(String name, int age) { System.out.println("调用公有 Sting 类型的name " + name + ",int 类型的age :" + age); } /** * main方法 * * @throws ClassNotFoundException * @throws SecurityException * @throws NoSuchFieldException * @throws NoSuchMethodException * @throws InvocationTargetException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InstantiationException */ public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException { // 创建类对象 Class clazz = Class.forName("com.liuguangfa.fanshe.Student"); // 获取公有的成员属性并调用 Field f = clazz.getField("name"); // 通过反射创建新的学生实例 Student stu = (Student) clazz.getConstructor().newInstance(); // 通过反射赋值给创建的学生 f.set(stu, "张三"); System.out.println(stu.name); // 获取私有的成员属性调用 f = clazz.getDeclaredField("age"); f.setAccessible(true); f.set(stu, 22); System.out.println(stu.age); //获取所有的公有的成员属性 System.out.println("获取所有的公有的的成员属性"); Field [] fArrays =clazz.getFields(); for(Field i:fArrays) { System.out.println(i); } //获取公有的的、私有的成员属性 System.out.println("获取公有的、私有的成员属性"); fArrays = clazz.getDeclaredFields(); for(Field i :fArrays) { System.out.println(i); } } }
Java控制台的输出:
调用的公有、无参数构造器 张三 22 获取所有的公有的的成员属性 public java.lang.String com.liuguangfa.fanshe.Student.name 获取公有的、私有的成员属性 public java.lang.String com.liuguangfa.fanshe.Student.name private int com.liuguangfa.fanshe.Student.age
四、通过反射获取成员方法并调用
获取成员方法的类:Method
package com.liuguangfa.fanshe; import java.lang.reflect.Method; /** * 反射的运用 * * @author Liu_Xiansheng * */ public class Student { public String name; private int age; // 创建公有的方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void show1(String s) { System.out.println("调用show1方法,其中值为:" + s); } // 创建私有的方法 private void show2(int show2Int) { System.out.println("调用show21方法,其中值为:" + show2Int); } /** * main方法 * */ public static void main(String[] args) throws Exception { // 创建类对象 Class clazz = Class.forName("com.liuguangfa.fanshe.Student"); // 调用所有公有的方法 System.out.println("调用所有公有的、私有的方法"); Method[] methodArrays = clazz.getDeclaredMethods(); for (Method i : methodArrays) { System.out.println(i); } // 调用所有公有的方法 System.out.println("调用所有公有的方法"); methodArrays = clazz.getMethods(); for (Method i : methodArrays) { System.out.println(i); } // 调用指定的公有方法,并调用 System.out.println("调用指定的公有方法,并调用"); Method m = clazz.getMethod("show1", String.class); Student stu = (Student) clazz.getConstructor().newInstance();// 创建学生对象 m.invoke(stu, "刘广法博客你"); // 调用指定的私有方法,并调用 System.out.println("调用指定的私有方法,并调用"); m = clazz.getDeclaredMethod("show2", int.class); m.setAccessible(true);// 解除限制 m.invoke(stu, 22); } }
Java控制台输出:
调用所有公有的、私有的方法 public java.lang.String com.liuguangfa.fanshe.Student.getName() public void com.liuguangfa.fanshe.Student.setName(java.lang.String) public int com.liuguangfa.fanshe.Student.getAge() public void com.liuguangfa.fanshe.Student.show1(java.lang.String) public void com.liuguangfa.fanshe.Student.setAge(int) private void com.liuguangfa.fanshe.Student.show2(int) 调用所有公有的方法 public java.lang.String com.liuguangfa.fanshe.Student.getName() public void com.liuguangfa.fanshe.Student.setName(java.lang.String) public int com.liuguangfa.fanshe.Student.getAge() public void com.liuguangfa.fanshe.Student.show1(java.lang.String) public void com.liuguangfa.fanshe.Student.setAge(int) public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException public final void java.lang.Object.wait() throws java.lang.InterruptedException public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException public boolean java.lang.Object.equals(java.lang.Object) public java.lang.String java.lang.Object.toString() public native int java.lang.Object.hashCode() public final native java.lang.Class java.lang.Object.getClass() public final native void java.lang.Object.notify() public final native void java.lang.Object.notifyAll() 调用指定的公有方法,并调用 调用show1方法,其中值为:刘广法博客你 调用指定的私有方法,并调用 调用show21方法,其中值为:22
文章原创作者:刘广法,感谢转载,网站地址:https://liuguangfa.com/