当前位置:   article > 正文

Java基础-class 类的基础方法_getdeclaredclasses

getdeclaredclasses

Class里的方法

1. getClasses 和 getDeclaredClasses
  • getDeclaredClasses 获取到类里所有的的class ,interface 包括了private ,protected,default,public

例子:
定义一个Payment的基本类如下

public class Payment {
    protected class InnerPayment{
    }
    String name;
    interface Account{}
    public class InnerAccount implements Payment.Account{
    }
    private class InnerAccount2 implements Payment.Account{
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

测试

public class PaymentReflectTest {
    public static void main(String[] args) {
      Class[] cls=Payment.class.getDeclaredClasses();//获取到所有的定义的class
        for (int i = 0; i <cls.length ; i++) {
            System.out.println(cls[i]);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

打印出来的结果如下

class rechard.learn.reflect.Payment$InnerAccount2
class rechard.learn.reflect.Payment$InnerAccount
interface rechard.learn.reflect.Payment$Account
class rechard.learn.reflect.Payment$InnerPayment
  • 1
  • 2
  • 3
  • 4
  • getClasses 只获取到public
    上面的测试代码改成
   Class[] cls=Payment.class.getClasses();
        for (int i = 0; i <cls.length ; i++) {
            System.out.println(cls[i]);
        }
  • 1
  • 2
  • 3
  • 4

只获取到

class rechard.learn.reflect.Payment$InnerAccount
  • 1
2. getConstructors 和 getDeclaredConstructors
  • getDeclaredConstructors 打印出类的所有的构造函数
   Class[] cls=Payment.class.getDeclaredClasses();
        for (int i = 0; i <cls.length ; i++) {
            Constructor[] cs= cls[i].getDeclaredConstructors();
            for (int j = 0; j <cs.length; j++) {
                System.out.println(cs[j]);
            }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

打印的结果如下

private rechard.learn.reflect.Payment$InnerAccount2(rechard.learn.reflect.Payment)
public rechard.learn.reflect.Payment$InnerAccount(rechard.learn.reflect.Payment)
protected rechard.learn.reflect.Payment$InnerPayment(rechard.learn.reflect.Payment)
  • 1
  • 2
  • 3

由于这里的class都是内部类,第一个参数是父类。new 的时候使用new Payment().new InnerAccount();

如果定义的内部类是static ,则new 的时候使用new Payment.InnerStaticAccount()

public class Payment {
 public static class InnerStaticAccount implements Payment.Account{
 }
 }
  • 1
  • 2
  • 3
  • 4
  • getConstructors 打印出类的public构造函数
3. new instance

如何new Payment里的InnerAccount

public class Payment {
      protected class InnerAccount implements Payment.Account{
        private String acctNumber;
        public InnerAccount(String acctNumber){
            this.acctNumber=acctNumber;
        }

        public String getAcctNumber() {
            return acctNumber;
        }

        @Override
        public String toString() {
            return "InnerAccount{" +
                    "acctNumber='" + acctNumber + '\'' +
                    '}';
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

如果 new InnerAccount 的类不和Payment 在同一个package下,写成如下,会报错,InnerAccount为proctected 不可见:

new Payment().new InnerAccount("111111");
  • 1

改成以下代码调用

        Class[] cls = Payment.class.getDeclaredClasses();
        for (int i = 0; i < cls.length; i++) {
           if(cls[i].getSimpleName().equals("InnerAccount")){
               try {
                   Constructor c=(Constructor)cls[i].getDeclaredConstructor(Payment.class,String.class);
                   c.setAccessible(true);
                   System.out.println(c.newInstance(new Payment(),"123"));
               } catch (Exception e) {
                   e.printStackTrace();
               }
           }
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

其实这样构造出来的有诸多不变,上面的c.newInstance(new Payment(),"123"),没法用一个实际的引用的引用,只能用Object o 来引用,如果如果要调用getAcctNumber(),只能通过反射来调用,如下:

 Class[] cls = Payment.class.getDeclaredClasses();
        for (int i = 0; i < cls.length; i++) {
           if(cls[i].getSimpleName().equals("InnerAccount")){
               try {
 Constructor c=(Constructor)cls[i].getDeclaredConstructor(Payment.class,String.class);
                   c.setAccessible(true);
                   Object o=c.newInstance(new Payment(),"123");
                   Method m=o.getClass().getMethod("getAcctNumber",null);
                   System.out.println(m.invoke(o,null));
                   }catch (Exception e) {
                   e.printStackTrace();
               }
           }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/306647
推荐阅读
相关标签
  

闽ICP备14008679号