博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
reflect
阅读量:5862 次
发布时间:2019-06-19

本文共 1270 字,大约阅读时间需要 4 分钟。

hot3.png

反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Class Foo{}

Foo foo1 = new Foo();

Class c1 = Foo.class;

Class c2 = foo1.getClass();

//c1和c2都表示了foo类的实例对象,一个类只可能是一个Class类的实例对象

//类也是对象,是class类的实例对象,这个对象我们称为此类的类型

//第三种表达方式

Class c3= Class.forName("com.imooc.reflect.Foo");

//结果是c3==c2;c2==c1;

//我们完全可又通过类的类类型创建此类的对象实例。

Foo foo = (Foo)c1.newInstance();

//new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类

//通过动态加载类,可解决这个问题。

Object obj = new Object();

Class c1 = obj.class;

Method[] ms = c.getMethods();

for(int i=0;i<ms.length;i++){

    ms[i].getName();

}

getDeclaredMethods()获取的是所有该类自己声明的方法。

反射获取成员变量的信息

成员变量也是对象,java.lang.reflect.Field封装了关于成员变量 的操作

1.获取构造han数的信息

c.getDeclaredConstructor();

关于 方法的反射

2.如何获取某个方法

    方法的名称和方法的参数列表才能唯决定某个方法

3.方法反射的操作

    method.invoke(对象,参数列表)

    要获取一个方法就是要获取类的信息,获取类的信息首先就要获取类的类型。

Class A{

    public void print(int a,int b){

}

}

方法的反射操作是用m对象来进行方法调用。  

class A {

    public void print(int a,int b){

    System.out.println(a+b);   

}

}

A a1 = new A();

Class c = a1.class;

Method m = c.getMethod("print",int.class,int.class);

Object o = m.invoke(a1,new Object[]{10,20});    或者    Object o = m.invoke(a1,10,20);

反射的操作都是编译之后的操作

编译之后的泛型是去泛型化的,java中集合的泛型,是防止错误输入的,只在编译阶段有效。

可以通过反射来操作,绕过编译。

转载于:https://my.oschina.net/u/1424203/blog/529764

你可能感兴趣的文章
C#编程(六)------------枚举
查看>>
《系统架构师》——操作系统和硬件基础
查看>>
如何看待一本图书
查看>>
oracle参数列表
查看>>
Wordpress3.2去除url中的category(不用插件实现)
查看>>
macOS Sierra 代码显示未来 Mac 将搭载 ARM 芯片
查看>>
Linux 中如何通过命令行访问 Dropbox
查看>>
开发进度——4
查看>>
JS里验证信息
查看>>
Akka actor tell, ask 函数的实现
查看>>
windows10 chrome 调试 ios safari 方法
查看>>
Hello , Ruby!
查看>>
Netty 4.1.35.Final 发布,经典开源 Java 网络服务框架
查看>>
详解Microsoft.AspNetCore.CookiePolicy
查看>>
SCDPM2012 R2实战一:基于SQL 2008 R2集群的SCDPM2012 R2的安装
查看>>
SQL SERVER中字段类型与C#数据类型的对应关系
查看>>
Linux lsof命令详解
查看>>
SVG path
查看>>
js判断checkbox是否选中
查看>>
多系统盘挂载
查看>>