JAVA学习历程记录(十一)
反射
获取字节码对象
Class<String> clz = String.class;
Class<Person> per = Person.class;
Class<int[]> clz1 = int[].class;
// System.out.println(clz);
// System.out.println(per);
// System.out.println(clz1);
Object o = "abc";
System.out.println(o.getClass());
// Class<Date> clz3 = (Class<Date>)Class.forName("java.util.Date");
Class<Date> clz3 = (Class<Date>) Class.forName("java.util.Date");
获取构造方法
//获取有参
Constructor<String> cs = clz.getDeclaredConstructor(char[].class);
//创建对象
String str = cs.newInstance(new char[]{'a','b','c'});
// System.out.println(str);
Constructor<Person> cp = per.getDeclaredConstructor();
Constructor<Person> cp2 = per.getDeclaredConstructor(int.class,String.class);
Person p = cp.newInstance();
Person p2 = cp2.newInstance(5,"asd");
获取属性
Field f = clz.getDeclaredField("hash");
f.setAccessible(true);
System.out.println(f);
String str = "asdfasdf";
f.set(str,10);
System.out.println(f.get(str));
//给字符串的哈希值赋值
Field[] f1 = clz.getDeclaredFields();
for (Field field : f1) {
System.out.println(field);
}
Constructor<Person> cp = per.getDeclaredConstructor();
Constructor<Person> cp2 = per.getDeclaredConstructor(int.class,String.class);
//创建实例化对象
Person p = cp.newInstance();
//寻找属性,fp代表这个属性
Field fp = per.getDeclaredField("age");
//暴力破解
fp.setAccessible(true);
//修改fp的值,即修改age的值
fp.set(p,5);
输出fp
System.out.println(fp.get(p));
获取方法
Constructor<Person> cp = per.getDeclaredConstructor();
Constructor<Person> cp2 = per.getDeclaredConstructor(int.class,String.class);
// Person p = cp.newInstance();
Method mp = per.getDeclaredMethod("weight", int.class);
mp.setAccessible(true);
//p的位置就放构造方法的实例化
// int a = (int) mp.invoke(p,15);
int a = (int) mp.invoke(cp.newInstance(),15);
System.out.println(a);
获取枚举
Class cle = String.class;
Mum[] muns = (Mum[]) cle.getEnumConstants();
for (Mum mum : muns) {
System.out.println(mum);
}
enum Mum{
a,b,c,d;
}
获取父类
Class pa = per.getSuperclass();
System.out.println(pa);
Constructor con = pa.getDeclaredConstructor();
Pa pas = (Pa) con.newInstance(); //实例化
con.setAccessible(true);
Field fa = pa.getDeclaredField("a");
fa.setAccessible(true);
fa.set(pas,5);
System.out.println(fa.get(pas));
Method method = pa.getDeclaredMethod("abc",int.class);
method.setAccessible(true);
int i = (int) method.invoke(pas,7);
System.out.println(i);
获取接口
Class[] cli = clz.getInterfaces();
for (Class c : cli) {
Method[] m = c.getDeclaredMethods();
System.out.println(m);
}
获取名字
per.getName();
获取简称名字
per.getSimpleName();
获取包名
per.getPackage();
per.getTypeName();
判断相关方法
//判断是否是匿名类
isAnonymousClass();
//判断是否是数组
isArray();
//判断是否是枚举
isEnum();
//判断是否是接口
isInterface();
//判断是否是基本数据类型
isPrimitive();
//判断类与对象之间的关系
isInstance();
//判断类与接口的实现关系
isAssignableFrom();
Field类和Method类
Class person = Person.class;
Person pi = (Person) person.newInstance();
Field[] field = person.getDeclaredFields();
for (Field f : field) {
//打印属性名和属性类型
System.out.println(f.getName()+" " +f.getType());
}
Method method = person.getDeclaredMethod("weight", int.class);
//获取参数个数
System.out.println(method.getParameterCount());
//获取全部参数类型
Class[] cs = method.getParameterTypes();
for (Class c : cs) {
System.out.println(c);
}
//获取返回值类型
System.out.println(method.getReturnType());
//获取方法中的泛型
System.out.println(method.getTypeParameters());
联系
用反射实现Object类的clone方法