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.通过反射获得属性 如:brand
Field 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());//依次输出各个属性字段的名称
}
}
}
2.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.forName
String 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());//1554874502
System.out.println(cls2.hashCode());//1554874502
System.out.println(cls3.hashCode());//1554874502
System.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);//int
System.out.println(characterClass);//char
System.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());//1846274136
System.out.println(type1.hashCode());//1846274136
}
}
2.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 = Se