JAVA反射机制

5.通过class获取对象的构造函数并且通过构造函数实例化对象

  一:获取构造方法

  1.getConstructor();获取默认无参构造(不能获取private修饰的无参构造)  2..getConstructors()获取所有的public修饰的构造方法 3.getConstructor(String.class,int.class)获取指定参数的pulic构造方法

  4.getDeclaredConstructors()获取所有构造包括private修饰的构造 5.getDeclaredConstructor(String.class,int.class,double.class)获取指定的私有构造方法

注意1.getDeclaredConstructor()如果不传入对应的参数则获取的是默认无参的构造方法(这个方法既可以获取public的无参也可以获取private的无参)

 2如果用getConstructor()获取指定的私有构造会报错误:

  Exception in thread "main" java.lang.NoSuchMethodException: javaInvoke.Emp.<init>(java.lang.String, int, double)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getConstructor(Unknown Source)
    at javaInvoke.testInvokeDemo.main(testInvokeDemo.java:52)

 二:通过构造方法进行实例化

   constructor 对象调用方法newInstance(传入构造方法对应的参数);   注意如果是私有构造实例化需要在实例化之前  conPri.setAccessible(true);调用这个方法进行安全检查设定为允许否则会报如下错误:

Exception in thread "main" java.lang.IllegalAccessException: Class javaInvoke.testInvokeDemo can not access a member of class javaInvoke.Emp with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(Unknown Source)
    at java.lang.reflect.AccessibleObject.checkAccess(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at javaInvoke.testInvokeDemo.main(testInvokeDemo.java:57)

DEMO案例如下:

  package javaInvoke;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

class Emp{
    
    public Emp(){
    
    }
    /*
    private Emp(){
    
    }
    */
    public Emp(String name){
    
    }
    
    public Emp(String name,int items){
    
    }
    
    private Emp(String name,int items,double dou){
    
    }
}
public class testInvokeDemo {
    
    public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    
    /*获取对象的class字节码对象*/
     Class<Emp> claz = Emp.class;
    
     /*获取对象的无参构造*/
     Constructor con = claz.getConstructor();
     System.out.println(con+"无参构造");
    
     /*获取对象所有public构造方法*/
      Constructor[] cons = claz.getConstructors();
      for(Constructor conc:cons){
          System.out.println(conc+"所有public构造方法");
      }
      
      /*获取指定参数的构造方法*/      
      Constructor  conn = claz.getConstructor(String.class,int.class);
      System.out.println(conn+"获取指定参数的构造方法");
      
      /*获取所有构造方法包括私有构造方法*/
      Constructor[] cono=claz.getDeclaredConstructors();
      for(Constructor cond:cono){
          System.out.println(cond);
      }
      
      /*获取指定的私有构造方法*/
      Constructor conPri1= claz.getDeclaredConstructor();
      System.out.println(conPri1+"获取默认的构造方法");
      Constructor conPri = claz.getDeclaredConstructor(String.class,int.class,double.class);
      System.out.println(conPri+"获取私有构造");
      
      /*允许不通过安全检查就可以用私有构造函数进行实例化对象*/
      conPri.setAccessible(true);
      
      /*通过构造实例化对象方法,传入构造方法对应的参数*/
      Object obj = conPri.newInstance("反射",1,2.0);
      System.out.println(obj.toString()+"通过反射获取的构造函数进行实例化");
      
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值