一、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()); */ }