Java中的反射( 二 )


每一个类的Class对象都只有一个 。
示例代码:
package com.test.code.reflex;public class Student {}public class Demo01 {public static void main(String[] args) throws ClassNotFoundException {// 获得Student类对应的Class对象Class<Student> c1 = Student.class;// 创建学生对象Student stu = new Student();Class<? extends Student> c2 = stu.getClass();System.out.println(c1 == c2);// 通过Class类的静态方法获得: static Class forName("类全名")Class<?> c3 = Class.forName("com.test.code.reflex.Student");System.out.println(c1 == c3);System.out.println(c2 == c3);}}Demo01运行结果:

Java中的反射

文章插图
 
(2)Class类常用方法String getSimpleName(); 获得类名字符串:类名 String getName(); 获得类全名:包名+类名 T newInstance() ; 创建Class对象关联类的对象示例代码:
public class Demo02 {public static void main(String[] args) throws IllegalAccessException, InstantiationException {// 获得Class对象Class<Student> c = Student.class;// 获得类名字符串:类名System.out.println(c.getSimpleName());// 获得类全名:包名 + 类名System.out.println(c.getName());// 创建对象Student stu = (Student)c.newInstance();System.out.println(stu);}}Demo02运行结果:
Java中的反射

文章插图
 
4.反射之操作构造方法(1)Constructor类概述反射之操作构造方法的目的:获得Constructor对象来创建类的对象 。
Constructor类概述:类中的每一个构造方法都是一个Constructor类的对象
(2)Class类中与Constructor相关的方法
1. Constructor getConstructor(Class... parameterTypes)
* 根据参数类型获得对应的Constructor对象 。
* 只能获得public修饰的构造方法
2. Constructor getDeclaredConstructor(Class... parameterTypes)
* 根据参数类型获得对应的Constructor对象
* 可以是public、protected、(默认)、private修饰符的构造方法 。
3. Constructor[] getConstructors()
* 获得类中的所有构造方法对象 , 只能获得public的
4. Constructor[] getDeclaredConstructors()
* 获得类中的所有构造方法对象
* 可以是public、protected、(默认)、private修饰符的构造方法 。
(3)Constructor对象常用方法
1. T newInstance(Object... initargs)"—— 根据指定的参数创建对象
2. void setAccessible(true) 设置"暴力反射"——是否取消权限检查 , true取消权限检查 , false表示不取消
示例代码:
public class Student {private String name;private String sex;private int age;//公有构造方法public Student(String name, String sex, int age) {this.name = name;this.sex = sex;this.age = age;}//私有构造方法private Student(String name, String sex) {this.name = name;this.sex = sex;}}public class Demo03 {/*** Constructor[] getConstructors()*获得类中的所有构造方法对象 , 只能获得public的* Constructor[] getDeclaredConstructors()*获得类中的所有构造方法 , 包括private修饰的*/@Testpublic void test03(){// 获得Class对象Class<Student> c = Student.class;// 获得类中的所有构造方法对象 , 只能是public修饰的Constructor<?>[] cons_one = c.getConstructors();for (Constructor<?> con : cons_one) {System.out.println(con);}System.out.println("--------------------------------");// 获取类中所有的构造方法 , 包括public、protected、(默认)、private的Constructor<?>[] cons_two = c.getDeclaredConstructors();for (Constructor<?> con : cons_two) {System.out.println(con);}}/*** Constructor getDeclaredConstructor(Class... parameterTypes)*根据参数类型获得对应的Constructor对象*/@Testpublic void test02() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 获得两个参数构造方法对象Constructor<Student> con = c.getDeclaredConstructor(String.class, String.class);// 取消权限检查(暴力反射)con.setAccessible(true);// 根据构造方法创建对象Student stu = con.newInstance("liuyifei", "女");System.out.println(stu);}/*** Constructor getConstructor(Class... parameterTypes)*根据参数类型获得对应的Constructor对象*/@Testpublic void test01() throws Exception {// 获得Class对象Class<Student> c = Student.class;// 获得无参数构造方法对象 注意:记得在Student类中加无参构造方法 , 不然会报错Constructor<Student> con = c.getConstructor();// 根据构造方法创建对象Student student = con.newInstance();System.out.println(student);// 获得有参数的构造方法对象Constructor<Student> con2 = c.getConstructor(String.class, String.class, int.class);// 创建对象Student stu2 = con2.newInstance("jack", "男", 18);System.out.println(stu2);}}


推荐阅读