java反射forname_java反射 - Louis - OSCHINA - 中文开源技术交流社区

看了别人的那么多文章,总归不是办法;还是自己整理,按照自己的理解来!

1,Class类

说明:此类的实例是标示正在运行的java类或者接口;Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。我们可以根据不同对象的.getClass()获得;

例:Class backupEntityClass  = backupEntity.getClass();

方法说明:

1e706e6c012776dfe2b42122dd9fd103.png

bf428938f1070ce3847c3ba59b936e29.png

1d93f68d338a6a7aa1498ba6a652924c.png

850a8d798fa8829fbad9329a60723ad2.png

09e780434dd956d456784ec116b0548b.png

注:我主要使用的分为5类

1,获取class   forName

2,实例化对象   newInstance();

3,获得属性值(不包括继承的----一定要注意)

4,获得方法(不包括继承的)

5,获得注解

2,Method

说明:Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

方法说明:

4364966cddd0ade911438b0bdc16305e.png

ba90318dba9e23dca048760530426167.png

注:我常用的:获取方法名    执行方法并获得返回值

3,Field

Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

我主要用的方法是:get/set  获取或设置属性值

getAnnotation 获得注解

4,PropertyDescriptor

PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。

d73e5861b2da2a5f24dec801d31f3240.png

1565dd7899a820bbef64fd60b2ca9d90.png

5,运用实例(Copy对象)

package com.yhy.app.basic;

import java.beans.IntrospectionException;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

public class EntityCopyUtil {

public T backup(Object entity,Class clazz) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException{

Class entityClass = entity.getClass();

Field[] entityFields =entityClass.getDeclaredFields();

T backupEntity = clazz.newInstance();

Class backupEntityClass  = backupEntity.getClass();

Field[] backupEntityFields =backupEntity.getClass().getDeclaredFields();

for(Field ef:entityFields){

for(Field bef:backupEntityFields){

if(ef.getName().equals(bef.getName())){

PropertyDescriptor epd = new PropertyDescriptor(ef.getName(),entityClass);

Method getMethod = epd.getReadMethod();//获得get方法

PropertyDescriptor bepd = new PropertyDescriptor(bef.getName(),backupEntityClass);

Method setMethod = bepd.getWriteMethod();//获得set方法

setMethod.invoke(backupEntity, getMethod.invoke(entity));

}

}

}

return (T) backupEntity;

}

}

注:上面例子有一个漏洞;我们无法复制父类的属性;那么我们使用的时候怎么解决呢?通过getsuperClass再重新做一次getfiles来实现;

图片都是从API上截取的,一直热衷于API文档  从未被超越!嘿嘿

6,AccessibleObject

083f941288cda220bc52312c0627240b.png

AccessibleObject 类是 Field、Method 和 Constructor 对象的基类。它提供了将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。对于公共成员、默认(打包)访问成员、受保护成员和私有成员,在分别使用 Field、Method 或 Constructor 对象来设置或获取字段、调用方法,或者创建和初始化类的新实例的时候,会执行访问检查。

fef8e9d452344f7c379d65e11be4ef8d.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值