美文网首页工作生活
Java基础-class 类的基础方法

Java基础-class 类的基础方法

作者: 架构师Javaspring | 来源:发表于2019-07-04 12:30 被阅读0次

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{

    }

}

测试

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]);

        }

    }

}

打印出来的结果如下

class rechard.learn.reflect.Payment$InnerAccount2

class rechard.learn.reflect.Payment$InnerAccount

interface rechard.learn.reflect.Payment$Account

class rechard.learn.reflect.Payment$InnerPayment

getClasses 只获取到public

上面的测试代码改成

  Class[] cls=Payment.class.getClasses();

        for (int i = 0; i <cls.length ; i++) {

            System.out.println(cls[i]);

        }

只获取到

1.class rechard.learn.reflect.Payment$InnerAccount

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]);

            }

        }

打印的结果如下

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)

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

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

public class Payment {

public static class InnerStaticAccount implements Payment.Account{

}

}

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 + '\'' +

                    '}';

        }

    }

}

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

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

改成以下代码调用

        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();

              }

          }

        }

其实这样构造出来的有诸多不变,上面的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();

              }

          }

}

相关文章

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

    Class里的方法 1. getClasses 和 getDeclaredClasses getDeclaredC...

  • Android JNI学习手册

    一、JNI基础学习-JNI调用java原生方法 JNI调用java原生方法有四个重要的东西 一、class 类信息...

  • Spring Boot 深拷贝对象

    背景 Java Class类的clone()方法默认为浅拷贝模式,只能实现Java基础类型的按值拷贝操作,对对象拷...

  • java反射

    参考:深入解析Java反射(1) - 基础 获取class对象 判断是否某个类实例 创建实例 获取方法 getDe...

  • Java基础 - Class类

    Class类是什么? 首先Class类来源于java.lang.Class Class 本身也是一个类,还是个泛型...

  • Java 八股文

    一、Java 基础知识 1、Object 类相关方法 getClass获取当前运行时对象的 Class 对象。 h...

  • Class类与反射

    Java的Class类是java反射机制的基础,通过Class类我们可以获得关于一个类的相关信息,下面我们来了解一...

  • 傻瓜教你反射(一)——Class

    反射基础 Class类 铺垫动态代理 1.定义 Java中,每个class都有一个相应的Class对象(一个类-...

  • JAVA反射机制详解

    1.理解反射的基础:Class类 众所周知Java有个Object 类,是所有Java 类的继承根源,其内声明了数...

  • JDK核心包

    rt.jar:Java基础类库,也就是Java doc里面看到的所有的类的class文件。 tools.jar:是...

网友评论

    本文标题:Java基础-class 类的基础方法

    本文链接:https://www.haomeiwen.com/subject/rkvlhctx.html