JAVA-反射

1、什么是反射?为什么要反射?反射可以实现的应用场景

如果不用反射,那么代码可能会比较复杂

 public static void main(String[] args){
      Scanner input=new Scanner(System.in);
      System.out.println("请问你需要什么对象?");
      String needOnjStr=input.next();
      Object o=method1(needObjStr);
  }
  ​
  private static Object method1(String needObjStr){
      Object obj=null;
      if("A".equal(needOnjStr)){
          obj=new A();
      }
      if("B".equal(needOnjStr)){
          obj=new B();
      }
      if("C".equal(needOnjStr)){
          obj=new C();
      }
      if("Cat".equal(needOnjStr)){
          obj=new Cat();
      }
      //……省略以下代码……
      return obj;
  }

 

2、 Class

  public static void main(String[] args) {
      //我们无法之家通过new方法实例化class类
      //Class类无公有化的构造方法,所以报错
      //Class<Dog> c=new Class();
      //但是我们可以通过以下三种方法进行Class对象的创建
      Class dogClass;
      //第一种方法:用过类名去调用↓
      //通过 类名.class 这个方法会返回要给class对象
      dogClass=Dog.class;
      //第二种方法:通过对象名去获取↓
      Dog dog=new Dog();
      dogClass= dog.getClass();
      //第三种方法↓,可以通过Class.forName("类的路径");获取class对象
      //一般推荐这一种,第一种需要导包,第二种有对象了,就一般不会用对象获取class
      //第三种它可以通过读取配置文件来当作String参数,我们可以更加灵活
      try{
          dogClass=Class.forName("KB18.Day23.Dog");
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }
  }
 
  public static void main(String[] args) {
       try{
          Dog dog1=(Dog)dogClass.newInstance();
          dog1.method1();
      } catch (InstantiationException e) {
          //没有无参构方法
          System.out.println("没有无参构造器");
          e.printStackTrace();
      } catch (IllegalAccessException e) {
          //说明当没有权限
          System.out.println("没有权限");
          e.printStackTrace();
      }
  }
  public class Test01{
      public static void main(String[] args) throws Exception{
          Scanner input=new Scanner(System.in);
          while(true){
              System.out.println("请问你需要什么对象?");
              String needObjStr=intput.next();
              Object o=method1(needObjStr);
              Object o2=method2(needObjStr);
              System.out.println("123"+o.getClass());
              System.out.println("456"+o2.getClass());
          }
      }
      
      private static Object method1(String needObjStr){
          Object obj=new Object();
          if("A".equal(needOnjStr)){
              obj=new A();
          }
          if("B".equal(needOnjStr)){
              obj=new B();
          }
          if("C".equal(needOnjStr)){
              obj=new C();
          }
          if("Dog".equal(needOnjStr)){
              obj=new Dog();
          }
          //……省略n种以下代码……
          return obj;
      }
      
      private static Object method2(String needObjStr)throws Exception{
          Class c=Class.forName("KB18.KB18Java.scr.Day23.Dog"+needObjStr);
          retun c.newInstance();
      }
  }

3、 Constructor 构造器

 public class Test03{
      public static void main(String[] args) {
          try{
              Class<Dog> dogClass=
                  (Class<Dog>) Class.forName("KB18.KB18Java.scr.Day23.Dog");
              
              Constructor<Dog>[] dogC1=(Constructor<Dog>[]) dog.Class.getDecLaredConstructors();
              Constructor<Dog> dogC2=dogClass.getConstructor(String.class);
              Constructor<Dog> dogC3=dogClass.getConstructor(Integer.class);
              dogC1[2].setAccessible(true);
              Dog d1=dogC1[0].newInstance();
              Dog d2=dogC2.newInstance("123");
              Dog d3=dogC3.newInstance(123);
          }catch(ClassNotFoundException e){
              //类未找到
              e.printStackTrace();
          }catch(NoSuchMethodException e){
              //没有对应放啊
              e.printStackTrace();
          }catch(IllegalAccessException e){
              //无法实例化指定的类对象时抛出
              e.printStackTrace();
          }catch(InstantiationException e){
              //说明你当前无权限,可以通过以下代码
              //c.setAccessible(true);
              //上面这行代码可以强行获取权限
              e.printStackTrace();
          }catch(InvocationTargetExcrption e){
              //如果你的构造方法跑出了某个异常,会在这里被捕获
              //说明你调用的构造方法抛出了一个异常
              e.printStackTrace();
          }
      }
  }
  
  public class Dog{
      private Dog(){
      }
      public Dog(String stre){
          System.out.println("调用dogString参数构造器");
      }
      public Dog(Integer stre){
          System.out.println("调用dogInteger参数构造器");
      }
      public void method1(){
          System.out.println("Dog类的Method1方法");
      }
  }

4、Method

  private String sName;
  private String iAge;
  public Dog(){
  }
  public Dog(String stre){
      System.out.println("调用dogStrig参数构造器");
  }
  public Dog(Integer stre){
      System.out.println("调用dogInteger参数构造器");
  }
  public void method1(){
      System.out.println("Dog类的Mehtod1方法");
  }
  public String getsName(){
      return sName;
  }
  public void setsName(String sName){
      this.sName=sName;
  }
  public String setiAge(){
      return iAge;
  }
  public void setiAge(String iAge){
      this.iAge=iAge;
  }
  public void testMethod(String str){
      System.out.println(str);
  }
  @Override
  public String toString(){
      return "Dog{"+
          "sName="+sName+"\'"+
          ",iAge"+iAge+"'}"
  }
  
public static void main(String[] args) {
      try{
          Class<Dog> dogClass=
              (Class<Dog>) Class.forName("src.Day24.Dog");
          Dog dog=dogClass.newInstance();
          Method[] =dogClass.getClass.getDeClaredMrthods();
          System.out.println(dog);
          System.out.println("====================================");
          for(Method m:ms){
              System.out.println(m.getName());
              if(m.getName().startwith("set")){
                  m.invoke(dog,"12");
              }
          }
          System.out.println(dog);
          
          Method testM=dogClass.getClassMethod("tstetMethod",String.class);
          testM.invoke(dog,"这是一个测试,我想打印这句话");
      }catch(CalssNotFoundException e){
          e.printStackTrace();
      }catch(IllegalAccessException e){
           e.printStackTrace();
      }catch(InstantiationException e){
           e.printStackTrace();
      }catch(InvocationTargetException e){
           e.printStackTrace();
      }catch(NoSuchMethodException e){
           e.printStackTrace();
      }
  }

5、 Field

  
  public static void main(String[] args) throws Exception{
      Class<Dog> dogClass=
              (Class<Dog>) Class.forName("src.Day24.Dog");
      //获取所有属性
      Field[] fields=dogClass.getDevlaredFields();
      Dog dog=dogClass.newInstance;
      //输出长度
      System.out.println("fielsd.length:"+field.length);
      for(Field field:fields){
          //输出所有属性名字
          System.out.println(field.getName());
          if("iAge".equals(field,getName())){
              //由于iAge是私有属性,所以我们需要加强提权,调用
              field.setAccessible(true);
              field.set(dog,"3岁");
          }
          if("sName".equals(field.getName())){
              //由于sName时私有属性,所以我么需要强制提权。调用
              field.setAccessoible(true);
              field.set(dog,"旺财");
          }
      }
      System.out.println(dog);
  }

6、 Modifier

 
  public static void main(String[] args) throws Exception{
      //我们之前提到的所有的类,方法,属性,狗在其均在getModifiers();
      //方法,这个方法会返回对应对象的modifier值,
      //我们可以通过这个值去查询它是否包含某个修饰符
      
      //比如,我们想去判断某个属性是否为私有的,如果是,需要提权赋值
      Class<Dog> dogClass=
              (Class<Dog>) Class.forName("src.Day24.Dog");
      //获取所有属性
      Field[] fields=dogClass.getDeclaredFields();
      Dog dog=dogClass.newInstance();
      //输出长度
      System.out.println("fileds.length:"+fields.length);
      for(Field field:fields){
          //输出所有属性名字
          System.out.println(field.getName());
          if("iAge".equals(field.getName())){
              //先通过file.getModifiers()获取属性的所有访问修饰权限值
              //再通过Modifier类的静态方法,判断这个属性是否为共有
              //如果不是共有,我们需要提权,否则,我们默认无权修改会抛出异常
              if(!Modifier.isPublic(field.getModifies())){
                  field.setAccessible(true);
              }
              field.set(dog,"3岁");
          }
          if("sName".equals(field.getName())){
              if(!Modifier.isPublic(field.getModifiers())){
                  field.setAccessible(true);
              }
              field.setAccessible(true);
              field.set(dog,"旺财");
          }
      }
      System.out.println(dog);
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值