3.获取Class类对象的各种方式
- 前提:已经知道一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException
实例:Class cls1 = Class.forName("java.lang.Cat");
应用场景:多用于配置文件 , 读取类全路径,加载类
- 前提:若已知具体的类,通过 类.class 获取,该方式最为安全可靠,程序性能最高
实例:Class cls2 = Cat.class;
应用场景:多用于参数传递 , 比如通过反射得到对应构造器对象
- 前提:已某个类的实例,调用该实例的getClass()方法获取Class对象
实例:Class cls3 = 对象.getClass();//运行类型
应用场景:通过创建好的对象,获取Class对象
- 其他方式
ClassLoader cl = 对象.getClass().getClassLoad();
Class cls4 = cl.loadClass("类的全类名");
- 基本数据类型
byte,short,int,long,double,float,boolean.char
, 按如下方式得到Class类对象
Class cls = 基本数据类型.class
- 基本数据类型对应的包装类,可以通过
.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对象- 外部类,成员内部类 , 静态内部类 , 局部内部类,匿名内部类
- interface:接口
- 数组
- enum:枚举
- annotation:注解
- 基本数据类型
- 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.类加载文章插图
- 基本说明:
反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载
- 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强
推荐阅读
- day44-反射03
- 足底反射区疼痛是为什么
- 光发生全反射的条件 全反射的条件
- 非条件反射和条件反射的区别
- 什么样的材料有利于反射声音
- 球形反射面对射电波有什么作用
- 无名指根部是什么反射区
- 按摩升结肠反射区调肠胃消积滞
- 手影是光的反射吗 手影是光的反射吗?
- 中指根部是什么反射区
- 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强