反射
获取运行是的类信息
反射的过程:
类加载器加载:
链接:
验证:
准备:
解析:
初始化:
获取Class对象的方法:
Class.form("类的全限定名"); //通过这个拿到的对象把所有流程都走过了,出了这种方法,其他都不走初始化的这个过程
类名.getClass;
类名.class.getClass;
类名.class.getClassLoad;
*方法名* | *说明* |
---|---|
forName() | (1)获取Class对象的一个引用,但引用的类还没有加载(该类的第一个对象没有生成)就加载了这个类。 (2)为了产生Class引用,forName()立即就进行了初始化。 |
Object-getClass() | 获取Class对象的一个引用,返回表示该对象的实际类型的Class引用。 |
getName() | 取全限定的类名(包括包名),即类的完整名字。 |
getSimpleName() | 获取类名(不包括包名) |
getCanonicalName() | 获取全限定的类名(包括包名) |
isInterface() | 判断Class对象是否是表示一个接口 |
getInterfaces() | 返回Class对象数组,表示Class对象所引用的类所实现的所有接口。 |
getSupercalss() | 返回Class对象,表示Class对象所引用的类所继承的直接基类。应用该方法可在运行时发现一个对象完整的继承结构。 |
newInstance() | 返回一个Oject对象,是实现“虚拟构造器”的一种途径。****使用该方法创建的类,必须带有无参的构造器****。 |
getFields() | 获得某个类的所有的公共(public)的字段,包括继承自父类的所有公共字段。 类似的还有getMethods和getConstructors。 |
getDeclaredFields | 获得某个类的自己声明的字段,即包括public、private和proteced,默认但是不包括父类声明的任何字段。类似的还有getDeclaredMethods和getDeclaredConstructors。 |
将对象转位String
package com.gzy.面向对象.reflect.dom2.utils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
//
public class Util {
public static String strToObj(Object object) throws InvocationTargetException, IllegalAccessException {
Class obj = object.getClass();
StringBuilder sb = new StringBuilder();
Field[] declaredFields = obj.getDeclaredFields();
Method[] methods = obj.getDeclaredMethods();
for (Method method : methods) {
if (method.getName().startsWith("get")) {
String substringObj = method.getName().substring(3).substring(0,1).toLowerCase();
sb.append(substringObj).append(method.getName().substring(4)).append("=");
Object invoke = method.invoke(object, null);
if (invoke instanceof Date){}
sb.append(invoke).append(",");
/* System.out.println(substringObj);
System.out.println(invoke);
*/ // System.out.println(sb);
}
// sb.delete(sb.length()-1,sb.length());
}
sb.delete(sb.length()-1,sb.length());
return sb.toString();
}
}
内省(Introspctro)
invoke;调用方法(***)
introspctro: 是java对JavaBean类属性,事件的一种缺省处理方法
javaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法的命名符合某种规则,如果两个模块之间传递信息,可以将信息封装到JavaBean中,这种对象称为值对象(Value Object),这些信息存储在类的私有变量中,通过set(),get()获取
通过getBeanInfo(类);将类封装为
Introspctro.getBenaInfo(类.class); //获取到类的bena信息。
里面有:获取方法,属性,参数...
invoke;调用方法
//返回Employee类的BeanInfo对象
BeanInfo employeeInfo = Introspector.getBeanInfo(Employee.class);
//使用BeanInfo返回PropertyDescriptor对象数组
PropertyDescriptor[] propsDes = employeeInfo.getPropertyDescriptors();
//迭代所有的PropertyDescriptor,使用set方法对name和salary赋值,使用getter返回对应值
for (PropertyDescriptor prop : propsDes) {
if (prop.getName().equals("name")) {
prop.getWriteMethod().invoke(emp, "Alice");
System.out.println(prop.getReadMethod().invoke(emp));
}
if (prop.getName().equals("salary")) {
prop.getWriteMethod().invoke(emp, new Double(10000));
System.out.println(prop.getReadMethod().invoke(emp));
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQ1Ai4cT-1618647699021)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1617790186423.png)]
————————————————————————————————————————
e(emp));
}
}
[外链图片转存中...(img-KQ1Ai4cT-1618647699021)]
————————————————————————————————————————