zoukankan      html  css  js  c++  java
  • java中的反射

    1、何为java反射机制:

    在运行过程中,对于任意一个类都能够知道这个类的属性和方法;对于任意一个对象都能调用其属性和方法;这种动态获取信息和动态调用方法 就称为java反射

    2、获取Class对象的3种方法

    (1).通过Object类的getClass()方法。例如:

    Class c1 = new String("").getClass();

    (2).通过Class类的静态方法——forName()来实现:

    Class c2 = Class.forName("MyObject");

    (3).如果T是一个已定义的类型的话,在java中,它的.class文件名:T.class就代表了与其匹配的Class对象,例如:

    Class c3 = Manager.class;

    Class c4 = int.class;

    Class c5 = Double[].class;//基于java当中一切皆对象的特征

    3、Class类中的 几种重要的方法

    1.getName()

    一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象

    调用该方法会产生奇怪的结果

    2.newInstance()

    该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:

    MyObject x = new MyObject();

    MyObject y = x.getClass().newInstance();

    4.getComponentType()

    该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:

    int[] ints = new int[]{1,2,3};

    Class class1 = ints.getClass();

    Class class2 = class1.getComponentType();

    而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象

    5.isArray()

    判定此Class对象所对应的是否是一个数组对象。

    6.Field getField(String name)//返回一个field对象,它返回class对象所表示类或接口的 指定公共成员字段,name参数是一个String

    用于指定所需字段的简称

    package com.yiibai;

    import java.lang.reflect.*;

    public class ClassDemo {

       public static void main(String[] args) {

         ClassDemo c = new ClassDemo();
         Class cls = c.getClass();
           
         System.out.println("Field =");

         try {
            // string field
            Field sField = cls.getField("string1");
            System.out.println("Public field found: " + sField.toString());
         }
         catch(NoSuchFieldException e) {
            System.out.println(e.toString());
         }
       }
      
       public ClassDemo() {
          // no argument constructor
       }

       public ClassDemo(String string1) {      
          this.string1 = string1;
       }
       
       public String string1 = "yiibai";
    }
    7.Field[] getFields()//不带参数,返回的是一个Field类型的数组

    8.getMethods

    9.getSuperclass();//取得其他类的父类

    class hello{
        public static void main(String[] args) {
            Class<?> demo=null;
            try{
                demo=Class.forName("Reflect.Person");
            }catch (Exception e) {
                e.printStackTrace();
            }
            //取得父类
            Class<?> temp=demo.getSuperclass();
            System.out.println("继承的父类为:   "+temp.getName());
        }
    }
    --运行的结果是 java.lang.Object

     10.Constructor[] getConstructor()//无参构造器返回的是构造器的数组

    public class Student implements Comparable{
     public String name;
     public int age;
     public Student(){
      
     }
     public Student(String name){
      this.name = name;
     }
     public Student(int age){
      this.age = age;
     }
     public Student(String name,int age){
      this.name=name;
      this.age=age;
     }

    @Override
     public String toString() {
      return "Student [age=" + age + ", name=" + name + "]";
     }

    }

    //测试

    public static void constructTest(){
      
      Constructor[]  c = null;
      Constructor  c2 = null;
      
      Student st1 = null;
      Student st2 = null;
      Student st3= null;
      Student st4= null;
      try{
       //获取所有构造器数组的方法getConstructors()
          c = Class.forName("Student").getConstructors();//获得构造器
          st1 = (Student)c[0].newInstance("11");//通过构造器获得实例,不管参数是基本类型还是引用类型
          st2 = (Student)c[1].newInstance(12);
          st3 = (Student)c[2].newInstance("aa",2);
          st4 = (Student)c[3].newInstance();

    }catch(Exception e){
       e.printStackTrace();
      }

    System.out.println(st1);
      System.out.println(st2);
      System.out.println(st3);
      System.out.println(st4);

    }

    //运行结果:

    Student [age=0, name=2222]
    Student [age=0, name=11]
    Student [age=12, name=null]
    Student [age=2, name=aa]
    Student [age=0, name=null]

    11.Constructor getConstructor(Class parameterType)//参数是一个参数类型的Class,比如String.class;

    举例(部分截图):

     //实例1调用String(StringBuilder str)构造器
          String str = "ssseeee";    
          Constructor cc = (str.getClass()).getConstructor(class[] {StringBuilder.class});//通过传入的参数获取构造器,在实例化
          String str1 = (String)cc.newInstance(new StringBuilder("111"));//参照api,正确的写法应该是(new StringBuilder[] {new StringBuilder("111")});不过上面的写法也通过,下面也是
          System.out.println(str1);
      //实例2 Student(String str)构造器
          c2 = (Class.forName("Student")).getConstructor(class[] {String.class});
          Student sss = (Student)c2.newInstance(new String("2222"));//通过构造器获取实例,参数是根据木匾对象决定
       System.out.println(sss);

     添加一个新的链接:http://blog.csdn.net/liujiahan629629/article/details/18013523

  • 相关阅读:
    RabbitMQ学习总结(5)——发布和订阅实例详解
    RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程
    RabbitMQ学习总结(4)——分发任务在多个工作者之间实例教程
    RabbitMQ学习总结(3)——入门实例教程详解
    RabbitMQ学习总结(3)——入门实例教程详解
    RabbitMQ学习总结(2)——安装、配置与监控
    RabbitMQ学习总结(2)——安装、配置与监控
    ActiveMQ学习总结(4)——业界消息队列简介
    ActiveMQ学习总结(4)——业界消息队列简介
    华为云ModelArts图深度学习,学习知识还能考取微认证
  • 原文地址:https://www.cnblogs.com/muliu/p/5496204.html
Copyright © 2011-2022 走看看