day43-反射02( 二 )

3.获取Class类对象的各种方式

  1. 前提:已经知道一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
    实例:Class cls1 = Class.forName("java.lang.Cat");
    应用场景:多用于配置文件 , 读取类全路径,加载类
  2. 前提:若已知具体的类,通过 类.class 获取,该方式最为安全可靠,程序性能最高
    实例:Class cls2 = Cat.class;
    应用场景:多用于参数传递 , 比如通过反射得到对应构造器对象
  3. 前提:已某个类的实例,调用该实例的getClass()方法获取Class对象
    实例:Class cls3 = 对象.getClass();//运行类型
    应用场景:通过创建好的对象,获取Class对象
  4. 其他方式
    ClassLoader cl = 对象.getClass().getClassLoad();
    Class cls4 = cl.loadClass("类的全类名");
  5. 基本数据类型byte,short,int,long,double,float,boolean.char, 按如下方式得到Class类对象
    Class cls = 基本数据类型.class
  6. 基本数据类型对应的包装类,可以通过.TYPE得到Class类对象
    Class cls = 包装类.TYPE
例子:
package li.reflection.class_;import li.reflection.Car;//演示得到Class对象的各种方式public class getClass_ {public static void main(String[] args) throws ClassNotFoundException {//1.Class.forNameString classAllPath = "li.reflection.Car";//这里一般是通过配置文件获取全路径Class cls1 = Class.forName(classAllPath);System.out.println(cls1);//class li.reflection.Car//2.类名.class ,多用于参数传递Class cls2 = Car.class;System.out.println(Car.class);//class li.reflection.Car//3.对象.getClass() ,应用场景,有对象实例Car car = new Car();Class cls3 = car.getClass();System.out.println(cls3);//class li.reflection.Car//4.通过类加载器(4种)来获取到类的 Class对象//(1)先得到car对象的类加载器(每个对象都有一个类加载器)ClassLoader classLoader = car.getClass().getClassLoader();//(2)通过类加载器得到Class对象Class cls4 = classLoader.loadClass(classAllPath);System.out.println(cls4);//class li.reflection.Car//cls1,cls2,cls3,cls4其实是同一个Class对象System.out.println(cls1.hashCode());//1554874502System.out.println(cls2.hashCode());//1554874502System.out.println(cls3.hashCode());//1554874502System.out.println(cls4.hashCode());//1554874502//5.基本数据类型按如下方式得到Class类对象Class<Integer> integerClass = int.class;Class<Character> characterClass = char.class;Class<Boolean> booleanClass = boolean.class;System.out.println(integerClass);//intSystem.out.println(characterClass);//charSystem.out.println(booleanClass);//boolean//6.基本数据类型对应的8种包装类,可以通过 .TYPE得到Class类对象Class<Integer> type1 = Integer.TYPE;Class<Character> type2 = Character.TYPE;System.out.println(type1);System.out.println(integerClass.hashCode());//1846274136System.out.println(type1.hashCode());//1846274136}}4.哪些类有Class对象
  1. 外部类,成员内部类 , 静态内部类 , 局部内部类,匿名内部类
  2. interface:接口
  3. 数组
  4. enum:枚举
  5. annotation:注解
  6. 基本数据类型
  7. void
例子:
package li.reflection.class_;import java.io.Serializable;//演示哪些类有Class对象public class allTypeClass {public static void main(String[] args) {Class<String> cls1 = String.class;//外部类Class<Serializable> cls2 = Serializable.class;//接口Class<Integer[]> cls3 = Integer[].class;//数组Class<float[][]> cls4 = float[][].class;//二维数组Class<Deprecated> cls5 = Deprecated.class;//注解//Thread类中的枚举State--用来表示线程状态Class<Thread.State> cls6 = Thread.State.class;//枚举Class<Long> cls7 = long.class;//基本数据类型Class<Void> cls8 = void.class;//void类型Class<Class> cls9 = Class.class;//Class类也有System.out.println(cls1);//class java.lang.StringSystem.out.println(cls2);//interface java.io.SerializableSystem.out.println(cls3);//class [Ljava.lang.Integer;System.out.println(cls4);//class [[FSystem.out.println(cls5);//interface java.lang.DeprecatedSystem.out.println(cls6);//class java.lang.Thread$StateSystem.out.println(cls7);//longSystem.out.println(cls8);//voidSystem.out.println(cls9);//class java.lang.Class}}5.类加载
day43-反射02

文章插图