zoukankan      html  css  js  c++  java
  • 反射(一)

    通过一个对象找到其所在的类,在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);
     }
    }

  • 相关阅读:
    TensorFlow 使用预训练好的卷积神经网络和循环神经网络(lstm)模型处理图片转文字(im2txt)
    45度做人,90度做事,180度为人,360度处事
    SQL Server 和 Oracle 数据类型对应关系
    SQL Server 创建数据库
    SQL Server 2012 忘记sa用户处理方法
    剑指offer50:数组中重复的数字
    剑指offer49:把字符串转换成整数
    剑指offer48:不用加减乘除做加法
    剑指offer47:位运算+递归。求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
    剑指offer46:圆圈中最后剩下的数字(链表,递归)
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1948855.html
Copyright © 2011-2022 走看看