java-Reflect

一、Class类

(1)在面向对象的世界里,万事万物皆对象【包括类】。

  在java语言中,有两种事物不是对象:静态成员,普通数据类型。(但是呢,普通数据类型都有与之对应的包装类)

  静态的成员,它是属于类的,不是属于对象的。

  类是对象,类是java.lang.Class的对象。

(2)”类“这个对象给如何表示呢?

上面是Java.lang,Class的源代码,可以看出:他只允许JVM创建该类的实例

Class类实例的三种表现方式:

    //第一种
    Class foo1=Foo.class;
    //第二种
    Foo foo=new Foo();
    Class foo2=foo.getClass();
    //第三种
    Class foo3=null;
    try {
         foo3=Class.forName("songyan.test.Foo");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

这三种变现形式获得的是同一个对象

   System.out.println(foo1);
    System.out.println(foo2);
    System.out.println(foo3);
    System.out.println(foo1==foo2);
    System.out.println(foo3==foo2);

运行结果:

(3)通过类的类类型创建对象

//通过类的类类型创建对象
    try {
        Foo foo4=(Foo) foo1.newInstance();//需要有无参数的构造方法【他会去调用无参数的构造方法】
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

 二、Class动态加载类的用法

(1)动态加载与静态加载

  静态加载:编译时期加载

  动态加载:运行时记载,例:Class.forName("类的全称")

package com.songyan.reflect;

/**
 * Class 类类型
 * @author sy
 *
 */
public class Demo1 {
    public static Class getClasses()
    {
        Demo demo=new Demo();
        Class class1=null;
        //第一种方式
        //class1=Demo.class;
        //第二种方式
        //class1=demo.getClass();
        //第三种方式
        /*try {
            class1=class1.forName("com.songyan.reflect.Demo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }*/
        return class1;
    }
}

class Demo
{
    void method1(){}
    void method2(){}
    void method3(){}
    
}
/**
*什么是字节码
*当在源程序中用到Demo这个类时,首先要在硬盘上把这个类的代码编译成二进制的字节码文件,
*然后把这个二进制的字节码文件加载到内存中,形成字节码对象
*这字节码对象就可以创建Demo这个类的对象
**/

/**
 * Class.forName()的作用:返回指定类的字节码
 * 返回方式有两种:
 * 1,如果内存中有该字节码对象,就直接返回
 * 2,如果内存中没有该字节码文件对象
 * 就由编译器编译源代码,生成字节码文件,
 * 再由类加载器将字节码文件加载到内存,生成字节码对象
 * 返回该对象
 * 
 */

/**
 * 得到类的字节码的三种方式
 * Demo.class
 * demo.getClass()
 * class1.forName("com.songyan.reflect.Demo")
 * 三种方式获得的同一个类的字节码,是同一个对象。
 */

/**Class类的九个预定义Class实例对象
 * 八个基本数据类型。
 * 他们也有对应的Class对象
 * void 也有对应的class对象void.class
 */

/**
 * 只要是源程序中出现的类型,都有与之对应的实例对象
 * 例如:int[],void
 */

三、Class类的方法

判断对应类是否是基本数据类型:isPrimitive()
获得包装类对应得基本数据类型的字节码:Integer.TYPE
判断对应类是不是数组:isArray()
public static void test()
    {
        String str="abc";
        Class cl1=String.class;
        Class cl2=str.getClass();
        Class cl3=null;
        try {
            cl3=Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        /*System.out.println(cl1==cl2);
        System.out.println(cl1==cl3);*/
        //是否是基本数据类型
        System.out.println(cl1.isPrimitive());
        Class cl4=int.class;
        System.out.println(cl4.isPrimitive());
        //包装类不属于基本数据类型
        Class cl5=Integer.class;
        System.out.println(cl5.isPrimitive());
        //基本数据类型的包装类.TYPE返回该类对应的基本数据类型的字节码
        cl5=Integer.TYPE;
        System.out.println(cl5.isPrimitive());
        //判断该类是不是数组
        System.out.println(int[].class.isArray());
        
        
        
    }
获得对应类的方法:getMethods()
获得对应类的完整类名:getName()
获得对应类实现的接口:getInterfaces()
获得对应类所在的包:getPackage()
public static void main(String[] args)
    {
        test();
        /*Demo demo=new Demo();
        Class class1=getClasses();
        
        System.out.println("name::::"+class1.getName());*/
        /*System.out.println("************");
        for(int i=0;i<class1.getMethods().length;i++)
        {
            System.out.println(class1.getMethods()[i]);
        }
        System.out.println("************");
        for(int i=0;i<class1.getInterfaces().length;i++)
        {
            System.out.println(class1.getInterfaces()[i]);
        }
        System.out.println("************");
        System.out.println("package::::"+class1.getPackage());
        
        
*/        
        
        
    }

 四、构造方法的反射的应用

原文地址:https://www.cnblogs.com/excellencesy/p/8868567.html