反射

反射
获取运行是的类信息
反射的过程:
类加载器加载:
链接:
 	验证:
 	准备:
 	解析:
初始化:
获取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)]

————————————————————————————————————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值