创建Class类对象(类类型)
Dog.java:
private String name;
private String age;
private String type;
public String sex;
public static String color;
public void eating(){
System.out.println("正在吃东西,别打扰我!");
}
public void walk(int hour){
System.out.println("今天要散步"+hour+"小时");
}
方法一:
Class cls1 = Class.forName("demo11.Dog");
方法二:
Class cls2 = Dog.class;
方法三:
Dog dog = new Dog();
Class cls3 = dog.getClass();
反射创建对象
//其实调用的就是无参构造方法(反射返回的都是Object类型)
Object d1 = cls2.newInstance();
System.out.println(d1);
调用构造方法
1.反射调用无参构造方法
Constructor c1 = cls2.getConstructor();
Object d2 = c1.newInstance();
System.out.println(d2);
2.反射调用有参构造方法
Constructor c2 = cls2.getConstructor(String.class, String.class, String.class, String.class);
Object d3 = c2.newInstance("旺财", "3", "哈士奇", "公");
System.out.println(d3);
System.out.println("---------------");
3.类的所有构造方法遍历
Constructor[] cs = cls1.getConstructors();
for (Constructor c : cs) {
System.out.println(c);
//获得方法修饰符(返回的是一个整型,后面会看打印出对应的修饰符对应的值)
int modifier = c.getModifiers();
System.out.println("修饰符:" + modifier);
//获得方法参数类型
Class[] pts = c.getParameterTypes();
System.out.println("参数 :" + Arrays.toString(pts));
}
System.out.println("---------------");
结果:
调用类的成员变量
1.调用公开成员变量
Field f1 = cls2.getField("sex");//getField只能调用公开属性,包括父类的属性
//Field f1 = cls2.getField("name"); //异常
2.调用所有声明成员变量
Field f2 = cls2.getDeclaredField("sex");
Field f3 = cls2.getDeclaredField("name");//无异常
//getDeclaredField能获得所有属性包括private等等,但是不包括父类属性,但是能获取不代表能使用
3.调用静态成员变量
//给静态变量赋值不用指定对象,指定也不会报错
Field f4 = cls2.getField("color");
f4.set(null, "黑色");
4.成员变量赋值,取值
System.out.println(f1);
f1.set(d1, "公");
f2.set(d2, "母");
// f3.set(d3,"金毛");异常
System.out.println(d1);
System.out.println(d2);
System.out.println("---------------");
//获取成员变量的值
System.out.println(f1.get(d1));
System.out.println(f4.get(null));
System.out.println("---------------");
5.公开成员变量的遍历
Field fs[] = cls2.getFields();
for (Field f : fs) {
System.out.println(f);
System.out.println("\t变量名:"+f.getName());
System.out.println("\t变量类型:"+f.getType());
System.out.println("\t修饰符:"+f.getModifiers());
}
6.声明变量的遍历
System.out.println("---------------");
Field[] dfs = cls2.getDeclaredFields();
for(Field f : dfs){
System.out.println(f);
System.out.println("\t变量名:"+f.getName());
System.out.println("\t变量类型:"+f.getType());
System.out.println("\t修饰符:"+f.getModifiers());
}
结果:
成员方法的调用
1.无参方法的调用
System.out.println("---------------");
Method m1 = cls2.getMethod("eating");//无参方法
m1.invoke(d1);
2.有参方法的调用
System.out.println("---------------");
Method m2 = cls2.getMethod("walk", int.class);//有参方法
m2.invoke(d1,10);
3.遍历公开成员方法(包括父类)
//遍历公开的成员方法,因为会获得父类的方法,所以包括了Object类的各种方法
System.out.println("-------公开的成员方法--------");
Method[] ms = cls1.getMethods();
for(Method m : ms){
System.out.println(m);
System.out.println("\t修饰符:"+m.getModifiers());
System.out.println("\t返回类型:"+m.getReturnType());
System.out.println("\t方法名:"+m.getName());
System.out.println("\t参数数组:"+Arrays.toString(m.getParameterTypes()));
}
3.遍历声明成员方法(不包括父类)
System.out.println("------------声明的成员方法---------------");
Method[] dms = cls2.getDeclaredMethods();
for(Method m : dms){
System.out.println(m);
System.out.println("\t修饰符:"+m.getModifiers()+"\t"+to32(m.getModifiers()));
System.out.println("\t返回类型:"+m.getReturnType());
System.out.println("\t方法名:"+m.getName());
System.out.println("\t参数数组:"+Arrays.toString(m.getParameterTypes()));
}
System.out.println("====================================");
for (Field f : Modifier.class.getDeclaredFields()) {
if (f.getType() == int.class
&& Modifier.isFinal(f.getModifiers())
&& Modifier.isStatic(f.getModifiers())
&& Modifier.isPublic(f.getModifiers())
) {
System.out.println(f.get(null) + "---" + "\t\t\t" + to32((int) f.get(null)) + "\t" + f.getName());
}
}
}
结果:由于数据太多就展示部分
反射类的父类以及接口
//父类遍历
Class<?> temp = cls;
do{
System.out.println(temp);
temp = temp.getSuperclass();
}while(temp!=null);
//接口遍历
Class<?>[] clss = cls.getInterfaces();
for(Class<?> c : clss){
System.out.println(c);
}
修饰符对应的int返回值
System.out.println("====================================");
for (Field f : Modifier.class.getDeclaredFields()) {
if (f.getType() == int.class
&& Modifier.isFinal(f.getModifiers())
&& Modifier.isStatic(f.getModifiers())
&& Modifier.isPublic(f.getModifiers())
) {
System.out.println(f.get(null) + "---" + "\t\t\t" + to32((int) f.get(null)) + "\t" + f.getName());
}
}
}
public static String to32(int m) {
String ms = "00000000000000000000000000000000" + Integer.toBinaryString(m);
return ms.substring(ms.length() - 32);
}