• 反射(一)


    通过一个对象找到其所在的类,在Object类中存在以下的一个方法:

    public final Class<?> getClass()所有类的对象都可以使用getClass()方法完成操作,那么这个方法返回的是一个Class,通过这个方法可以实现反射操作。


    class Person
    {
    }
    public class PersonClassDemo {
     public static void main(String args[])
     {
      Person p1=new Person();
      System.out.println(p1.getClass().getName());
     }
    }
    在反射机制中Class类是一个操作的源头,所有的反射操作从此类展开,但是如果要想实例化此类对象可以通过以下的三个途径完成:

    1,通过Object类中的getClass()方法:public final Class<?>getClass()

    2,通过类.class的形式

    3,通过Class类的静态方法:

    public static Class<?> forName(String className)



    class Person
    {
    }
    public class PersonClassDemo {
     public static void main(String args[])
     {
      Person per=new Person();
      Class<?> c=per.getClass();
      System.out.println(c.getName());
      Class<?> c1=Person.class;
      System.out.println(c1.getName());
      try {
       Class<?> c2=Class.forName("Person");
          System.out.println(c2.getName());
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      }
     }
    }

    通过Class类实例化对象

    如果一个类中存在一个无参构造方法,那么可以直接通过Class类进行实例化的操作。

    步骤:

    1,根据包.类名称实例化Class对象

    2,通过Class类中的newInstance()方法来实例化对象。

    class Person
    {
     public String getString()
     {
      return "hello world";
     }
    }
    public class PersonClassDemo {
     public static void main(String args[])
     {
      Class<?> c1=null;
      try {
       c1=Class.forName("Person");
        
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      }
      try {
       Person p1=(Person)c1.newInstance();
      } catch (InstantiationException e) {
       e.printStackTrace();
      } catch (IllegalAccessException e) {
       e.printStackTrace();
      }
     }
    }
    要在像主函数那样调用,那么类必须有是无参构造,否则就要调用指定的构造方法,并向其传递指定的参数才可以进行实例化操作。

    如果要想得到一个类的构造方法,则可以使用以下的方法:

    public Constructor<?>[] getConstructors()

    这个方法得到全部的构造方法,因为一个类中存在多个构造方法,所有会以Constructor对象数组的形式返回,Constructor类的定义在java.lang.reflect包中,所以属性反射的操作包。

    取得一个构造方法之后,可以通过Constructor类以下的方法进行实例化:

    public T newInstance(Object...initargs)

    import java.lang.reflect.Constructor;

    class Person
    {
     private String name;
     private int age;
     Person(String name,int age)
     {
      this.name=name;
      this.age=age;
     }
     public String getString()
     {
      return "hello world";
     }
    }
    public class PersonClassDemo {
     public static void main(String args[]) throws Exception
     {
      Class<?> c1=null;
      Person per=null; 
         c1=Class.forName("Person");
      //得到构造方法数组
         Constructor cons[]=c1.getConstructors();
         //参数最多的作为第一个构造
         per=(Person)cons[0].newInstance("jin",22);
         System.out.println(per);
     }
    }

  • 相关阅读:
    [BZOJ]2132: 圈地计划 最小割
    从最近MySQL的优化工作想到的
    Linux基本操作 9----- 认识与学习bash
    多路径配置vlome group共享存储,VG的更新。
    两位数乘法的速算方法(一)
    请对他有足够的重视——设计!
    ASP.NET中配置应用程序
    flex开发小技巧集锦
    刚制作完的SAP Sybase ASE15.7 [Sybase Central] 客户端
    Static 关键字的 5 种用法,你会几种?
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1948855.html
Copyright © 2020-2023  润新知