黑马程序员技术交流社区
标题:
反射是什么? 反射获取字节码文件的三种方式?反射的好处
[打印本页]
作者:
愤怒的哈博兔
时间:
2015-8-14 21:33
标题:
反射是什么? 反射获取字节码文件的三种方式?反射的好处
作者:
晚上没饭吃
时间:
2015-8-14 21:33
反射:在运行状态下,通过class文件对象,去使用构造方法,成员变量,成员方法
方法有三种:
1.类名.class
2.对象.getclass()
3.class.forName("包名.类名")
好处:
只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法,包括私有的
同步方法
反射成员方法:
1.获取字节码文件
Class c = Class.forName("包名.类名");
2.反射方法
Method m = c.getMethod("反射的方法",方法的参数类型.class);
3.用方法,m.invoke(对象,参数) 对象,c.newInstance ,在A建立对象。
m.invoke(c.newInstance(),参数);
类加载器与反射有什么关系
反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的操作;
类加载器是通过某个类的.classLoader()方法,将该类的.class文件从硬盘中加载到java虚拟机中,形成字节码文件;
什么是字节码文件?
代码完成后,通过javac编译后形成.class文件,然后类加载器将.class文件从硬盘加载到java虚拟机中,形成字节码文件
作者:
heimafeng
时间:
2015-8-14 22:45
一.反射:
1.获取类的Class对象的三种方式:
1).Object-->getClass()方法;
2).任何类型都有一个class静态属性;
3).Class类的静态方法forName(String className);(常用)
2.通过Class对象获取构造方法、成员变量、成员方法:
1).构造方法:
---批量的;
* Constructor[] getConstructors():获取所有的"公有"构造方法;
Constructor[] getDeclaredConstructors()::获取所有的(包括私有的)构造方法;
每一个Constructor内部都包含了"一个构造方法"的详细信息;
---单个的
public Constructor getConstructor(Class ... parameterTypes):获取某个公有的构造方法
public Constructor getDeclaredConstructor(Class<?>... parameterTypes):获取某个构造方法(包括私有的)
---实例化对象:
1).Class--->newInstance();
2).Constructor-->newInstance();
---设置暴力访问:
setAccessible(true);
2).成员属性:
------批量的:
Field[] getFields():获取所有公有的成员变量
Field[] getDeclaredFields():获取所有成员变量(包括私有)
----单个的:
Field getField():获取单个,公有的成员变量
Field getDeclaredField():获取单个的成员变量,包括私有的
----为成员变量赋值:
Filed --> set(Object obj,Object value)
3).成员方法:
----批量的:
Method[] getMethods():获取所有公有的成员方法;
Method[] getDeclaredMethods():获取所有的成员方法包括私有的。
----单个:
Method getMethod():获取单个公有的成员方法;
Method getDeclaredMethod():获取单个成员方法,包括私有的;
----调用方法:
Method --> public Object invoke(Object obj,Object... args)
二.设计模式:
1.代理模式:
--动态代理:
1.定义一个类,实现:InvocationHandler
2.在使用时,使用Proxy:newProxyInstance()方法产生代理对象;
2.模板模式:
3.装饰模式:
三.JDK5的新特性:
1.自动装箱和拆箱
2.泛型
3.增强for循环
4.静态导入
5.可变参数
6.枚举
四.JDK7的新特性:
1.二进制字面量
2.数字字面量可以出现下划线
3.switch 语句可以用字符串
4.泛型简化
5.异常的多个catch合并
6.try-with-resources 语句
五.JDK8的新特性:
1.接口可以有方法了。
作者:
songynnm
时间:
2015-8-15 13:19
反射定义:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射,加载类的字节码的三种方式:://blog.sina.com.cn/s/blog_4ccc67550102v13r.html
反射的好处:
1、反射提高了程序的扩展性
2、配置文件和接口的方式是编程更加简单。
以TomCat服务器为例:
TomCat对外提供了一个Servlet接口,定义了处理请求和应答的方式。
以及一个web.xml配置文件,用户可以自定义MyServlet类实现Servlet接口
将类名添加到web.xml配置文件中,服务器可以根据类名获取class文件,
具体:http://m.blog.csdn.net/blog/ladooz/8466764
作者:
chajinglong
时间:
2015-8-16 16:54
Java反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类;
在运行时构造任意一个类的对象;
在运行时判断任意一个类所具有的成员变量和方法;
在运行时调用任意一个对象的方法;
生成动态代理。
反射的好处:
1、反射提高了程序的扩展性
2、配置文件和接口的方式是编程更加简单。
以TomCat服务器为例:
TomCat对外提供了一个Servlet接口,定义了处理请求和应答的方式。
以及一个web.xml配置文件,用户可以自定义MyServlet类实现Servlet接口
将类名添加到web.xml配置文件中,服务器可以根据类名获取class文件,
作者:
a2029460
时间:
2015-8-18 21:37
获取字节码文件Class对象,就成为了反射的第一步。
方式一:
通过对象的Class getClass()方法。
对于扩展性,这种并不好,因为需要使用该类,并还需要创建该类的对象。
通过对象的getClass方法才可以获取到字节码文件对象。
方式二:
任何一个数据类型,都对应的一个描述,都可以获取其对应的Class对象。而且是通过数据类型的一个静态属性完成,该属性就是class.
这种方式比第一种写法上更为简单。但是还是不利于扩展,因为还要用到Person类。
方式三:
通过Class类中的forName方法。根据指定字符串名称,就可以获取该名称对应的字节码文件的对象。
该方式扩展性非常好,只需给定类的字符串名称即可获取Class对象。
获取字节码文件的目的是什么?
是为了创建该字节码文件对象。然后再通过对象去调用对象中的方法。
现在已经可以通过forName方法获取class对象了。
作者:
l_15562009298
时间:
2015-8-28 13:19
优点:反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。
它允许程序创建和控制任何类的对象,无需提前硬编码目标类;
缺点:(1)性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。
因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
(2)使用反射会模糊程序内内部逻辑:
程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。
反射代码比相应的直接代码更复杂。
作者:
喵小莫
时间:
2015-8-28 23:49
1:反射(理解)
(1)类的加载及类加载器
(2)反射:
通过字节码文件对象,去使用成员变量,构造方法,成员方法
(3)反射的使用
A:通过反射获取构造方法并使用
B:通过反射获取成员变量并使用
C:通过反射获取成员方法并使用
(4)反射案例
A:通过反射运行配置文件的内容
B:通过反射越过泛型检查
C:通过反射给任意的一个对象的任意的属性赋值为指定的值
(5)动态代理
2:设计模式
(1)装饰设计模式
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner sc = new Scanner(System.in);
(2)模版设计模式
作者:
丹唯伯夷
时间:
2016-7-18 18:24
归纳的很到位。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2