前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础——反射

Java基础——反射

作者头像
羊羽shine
发布2019-05-28 13:38:27
3160
发布2019-05-28 13:38:27
举报
文章被收录于专栏:Golang开发
反射机制

将类的各个组成部分封装成其他对象,称作反射机制,反射被称作是框架设计的灵魂。

class

Java除了基本类型其他都是class,包括interface,String,Object Runnable,Exception class的本质是数据类型Type 无继承关系的数据类型无法赋值 class/insterface的数据类型是class 每加载一个class,JVM就为其创建一个Class类型的实例,并关联起来 JVM持有的每个Class实例都指向一个数据类型 一个Clas实例包含

获取字节码Class对象

同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪一种方式获取的Class对象都是同一个。 1.Class.forName("全类名"):将字节码加载到内存,返回Class对象,主要用于配置文件,将类名定义在配置文件中,读取文件,加载类

代码语言:javascript
复制
Class c = Class.forName("domain.Person");

2 类名.class 通过类名的属性class获取,主要用于参数传递

代码语言:javascript
复制
Class c = Person.class;

3对象.getClass(): getClass()方法在object类中定义 ,主要用于对象获取字节码的方法。

代码语言:javascript
复制
            Person p = new Person();
            Class c = p.getClass();
获取Class方法
代码语言:javascript
复制
getName()// 获取全类名
getSimpleName()
getPackage()
获取成员变量

通过Class实例获取字段field信息:

代码语言:javascript
复制
getField(name):获取某个public的field(包括父类) 
getDeclaredField(name):获取当前类的某个field(不包括父类) 
getFields():获取所有public的field(包括父类) 
getDeclaredFields():获取当前类的所有field(不包括父类)

getFields 只能获取public的方法

代码语言:javascript
复制
            Class c = Person.class;
            Field[] fields = c.getFields();
            for (Field f :fields){
                System.out.println(f);
            }

getDeclaredFields()可以获取所有的成员变量 修饰符对其不影响。

代码语言:javascript
复制
            Class c = Person.class;
            Field[] fields = c.getDeclaredFields();
            for(Field f :fields){
                System.out.println(f);
            }

Field对象包含一个field的所有信息:

代码语言:javascript
复制
getName() 
getType() 
getModifiers() // 获取修饰符

获取和设置field的值:

代码语言:javascript
复制
get(Object obj)// 获取一个实例对象的该字段的值
set(Object, Object)// 设置一个实例对象的该字段的值
代码语言:javascript
复制
            Person p = new Person();
            p.setGender("male");
            Field f = Person.class.getField("gender");
            Object value = f.get(p);
            System.out.println(value);
            f.set(p,"female");
            System.out.println(p.getGender());

对私有变量的修改,暴力反射setAccessible(true)

代码语言:javascript
复制
            Person p = new Person();
            p.setName("xiaoming");
            Field f = Person.class.getDeclaredField("name");
            f.setAccessible(true);
            Object value = f.get(p);
            System.out.println(value);
            f.set(p,"xiaowang");
            System.out.println(p.getName());
Constructor构造方法
代码语言:javascript
复制
Constructor<?> [] getConstructor()
Constructor<T> getConstructor(类<?>... parameterTypes)

构造函数创建对象newInstance

代码语言:javascript
复制
            Constructor constructor = Person.class.getConstructor(String.class,int.class);
            Object p = constructor.newInstance("xiaoming",20);

空参数构造可以使用class方法newInstance

Methord成员方法
代码语言:javascript
复制
Methods []getMethods // 获取所有的public成员方法(包括父类方法)
Method getMethod(String name,类<?>...parameterTypes)
 Method[] getDeclaredMethods()
代码语言:javascript
复制
 Method[] methods = Person.class.getDeclaredMethods();

获取方法赋值invoke

代码语言:javascript
复制
            Method setName = Person.class.getMethod("setName",String.class);
            Person p = new Person();
            setName.invoke(p,"xiaoming");

获取成员方法名称

代码语言:javascript
复制
            Method[] methods = Person.class.getMethods();
            for(Method m :methods){
                System.out.println(m.getName());
            }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.05.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 反射机制
  • class
  • 获取字节码Class对象
  • 获取Class方法
  • 获取成员变量
  • Constructor构造方法
  • Methord成员方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档