Class02:
package li.reflection.class_;import li.reflection.Car;import java.lang.reflect.Field;//演示Class类的常用方法public class Class02 {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {String classAllPath = "li.reflection.Car";//1.获取到 Car类 对应的 Class对象//<?>表示不确定的Java类型Class<?> cls = Class.forName(classAllPath);//2.输出clsSystem.out.println(cls);//将会显示cls对象是哪个类的Class对象class li.reflection.CarSystem.out.println(cls.getClass());//输出cls的运行类型 class java.lang.Class//3.得到包名System.out.println(cls.getPackage().getName());//li.reflection :Class对象对应的类是在哪个包下面//4.得到全类的名称System.out.println(cls.getName());//li.reflection.Car//5.通过cls创建一个对象实例Car car = (Car)cls.newInstance();System.out.println(car);//调用car.toString()//6.通过反射获得属性 如:brandField brand = cls.getField("brand");System.out.println(brand.get(car));//宝马//7.通过反射给属性设置值brand.set(car,"奔驰");System.out.println(brand.get(car));//奔驰//8.遍历得到所有的属性(字段)Field[] fields = cls.getFields();for (Field f:fields) {System.out.println(f.getName());//依次输出各个属性字段的名称}}}
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}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- day44-反射03
- 龙女反射弧是什么梗?
- 反射弧太长是什么意思?
- 反射弧有点长是什么梗?
- 反射弧短是什么意思?
- 环跳是哪里的反射区
- 衣架套头会转原理
- 发生全反射的条件是什么 发生全反射的条件是怎么样的呢
- 光的反射的概念是什么 光的反射的定义
- 海市蜃楼是折射还是反射 海市蜃楼 海市蜃楼简单介绍