与传统的通过new 来获取对象的方式不同
反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”
再通过构造器对象创建一个对象
获取构造方法:
public Constructor[] getConstructors();所有公共构造方法
public Constructor[] getDeclaredConstructors();所有构造方法
public Constructor<T> getConstructor(Class... parameterTypes);单个公共构造方法
参数表示:要获取的构造方法的构造参数的个数及数据类型的class字节码文件对象。
public Constructor<T> getDeclaredConstructor(Class... parameterTypes);单个任意构造方法
反射机制,会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”
再通过构造器对象创建一个对象
获取构造方法:
public Constructor[] getConstructors();所有公共构造方法
public Constructor[] getDeclaredConstructors();所有构造方法
public Constructor<T> getConstructor(Class... parameterTypes);单个公共构造方法
参数表示:要获取的构造方法的构造参数的个数及数据类型的class字节码文件对象。
public Constructor<T> getDeclaredConstructor(Class... parameterTypes);单个任意构造方法
- 创建一个对象
通过反射机制创建一个对象
package reflection; import java.lang.reflect.Constructor; import charactor.Hero; public class TestReflection { public static void main(String[] args) { //传统的使用new的方式创建对象 Hero h1 =new Hero(); h1.name = "teemo"; System.out.println(h1); try { //使用反射的方式创建对象 String className = "charactor.Hero"; //类对象 Class pClass=Class.forName(className); //构造器 Constructor c= pClass.getConstructor(); //通过构造器实例化 Hero h2= (Hero) c.newInstance(); h2.name="gareen"; System.out.println(h2); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
- 获取无参构造方法并使用
public static void main(String[] args) throws Exception { //获取字节码对象 Class c = Class.forName("cn.ref.Person"); //获取单个构造方法 Constructor con = c.getConstructor();//返回的是构造方法对象 //通过获取的构造方法创建一个新实例 Object obj = con.newInstance(); System.out.println(obj); Person p = (Person)obj; p.function(); }
- 获取带参构造方法并使用
public static void main(String[] args) throws Exception { //获取字节码对象 Class c = Class.forName("cn.ref.Person"); //获取带参构造方法 Constructor con = c.getConstructor(String.class,int.class,String.class);//返回的是构造方法对象 //通过获取的构造方法创建一个新实例 Object obj = con.newInstance("张三",20,"男"); System.out.println(obj); Person p = (Person)obj; System.out.println(p.getName()); }
- 获取私有构造方法并使用
public static void main(String[] args) throws Exception { // 获取字节码对象 Class c = Class.forName("cn.ref.Person"); // 获取私有构造方法 Constructor con = c.getDeclaredConstructor(String.class);// 返回的是构造方法对象 //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查 con.setAccessible(true);//设置为true才能访问私有,否则报java.lang.IllegalAccessException // 通过获取的构造方法创建一个新实例 Object obj = con.newInstance("张三"); System.out.println(obj); Person p = (Person) obj; System.out.println(p.getName()); }