反射(提供封装程序集、模块和类型的对象)
2017-11-01 16:15
295 查看
反射是一种计算机处理方式。有程序可以访问、检测和修改它本身状态或行为的这种能力。能提供封装程序集、类型的对象。(程序集包含模块,而模块包含类型,类型又包含成员。)
优点:
1、反射提高了程序的灵活性和扩展性。
2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
案例:
public class Person {
public String name;
public int age;
private float weight;
public Person(){
}
public Person(String name){
this.name=name;
System.out.println("姓名为"+name);
}
public Person(int age){
this.age=age;
System.out.println("年龄为"+age);
}
private Person(float weight){
this.weight=weight;
System.out.println("体重为"+weight);
}
public void Eat(String str){
System.out.println(str+"真好吃");
}
}
package Pag15;
/*反射
* Class 类
* Constructor 构造函数
* Method 方法
* Filed 字段
*/
import java.lang.reflect.Constructor;
public class TestDemo {
public static void main(String[] args) throws Exception {
TestDemo td = new TestDemo();
// td.Test1();
// td.Test2();
td.Test3();
}
public void Test1(){
int a=0;
for (int i = 0; i <3; i++) {
a+=i;
}
System.out.println(a);
}
public void Test2() throws Exception{
Class cl = Class.forName("Pag15.Person");
Constructor con = cl.getConstructor(String.class);
con.newInstance("理石");
}
public void Test3() throws Exception{
Class cl = Class.forName("Pag15.Person");
Constructor con = cl.getDeclaredConstructor(float.class);
con.setAccessible(true);
Object obj = con.newInstance(60);
}
}
package Pag15;
import java.lang.reflect.Method;
public class MethodDemo {
public static void main(String[] args) throws Exception {
Class cl= Class.forName("Pag15.Person");
Method md = cl.getMethod("Eat", String.class);
md.invoke(cl.newInstance(), "苹果");
}
}
package Pag15;
import java.lang.reflect.Field;
public class FiledDemo {
public static void main(String[] args) throws Exception {
Class cl = Class.forName("Pag15.Person");
Field[] fields = cl.getFields();//获取公共属性
// Field[] fields = cl.getDeclaredFields();//获取全部声明属性
for (Field f : fields) {
System.out.println(f.getName());
}
}
}
优点:
1、反射提高了程序的灵活性和扩展性。
2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
缺点:
1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。
2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。
案例:
public class Person {
public String name;
public int age;
private float weight;
public Person(){
}
public Person(String name){
this.name=name;
System.out.println("姓名为"+name);
}
public Person(int age){
this.age=age;
System.out.println("年龄为"+age);
}
private Person(float weight){
this.weight=weight;
System.out.println("体重为"+weight);
}
public void Eat(String str){
System.out.println(str+"真好吃");
}
}
package Pag15;
/*反射
* Class 类
* Constructor 构造函数
* Method 方法
* Filed 字段
*/
import java.lang.reflect.Constructor;
public class TestDemo {
public static void main(String[] args) throws Exception {
TestDemo td = new TestDemo();
// td.Test1();
// td.Test2();
td.Test3();
}
public void Test1(){
int a=0;
for (int i = 0; i <3; i++) {
a+=i;
}
System.out.println(a);
}
public void Test2() throws Exception{
Class cl = Class.forName("Pag15.Person");
Constructor con = cl.getConstructor(String.class);
con.newInstance("理石");
}
public void Test3() throws Exception{
Class cl = Class.forName("Pag15.Person");
Constructor con = cl.getDeclaredConstructor(float.class);
con.setAccessible(true);
Object obj = con.newInstance(60);
}
}
package Pag15;
import java.lang.reflect.Method;
public class MethodDemo {
public static void main(String[] args) throws Exception {
Class cl= Class.forName("Pag15.Person");
Method md = cl.getMethod("Eat", String.class);
md.invoke(cl.newInstance(), "苹果");
}
}
package Pag15;
import java.lang.reflect.Field;
public class FiledDemo {
public static void main(String[] args) throws Exception {
Class cl = Class.forName("Pag15.Person");
Field[] fields = cl.getFields();//获取公共属性
// Field[] fields = cl.getDeclaredFields();//获取全部声明属性
for (Field f : fields) {
System.out.println(f.getName());
}
}
}
相关文章推荐
- 反射手册笔记 2.程序集,对象和类型
- 反射手册笔记 2.程序集,对象和类型
- QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化
- [C#] 不同类型的对象之间快速拷贝(比反射快十倍)
- 用反射动态创建对象,类型无法转换的困惑
- 自动拆箱&自动装箱以及String 和基本数据类型封装类生成的对象是否相等
- 一切皆对象之两个方法概括js,无函数签名(无多态),原型,闭包,封装,引用类型,继承……
- java 各种类型数据,集合对象封装 成json
- .Net 中的反射(动态创建类型实例) - Part.4动态创建对象
- Mysql通用查询方法(采用泛型确定输入类型,BeanUtils进行对象封装)
- ###struts模型驱动(必须new)能够封装【对象类型属性的属性】.页面传参错误导致的问题:HTTP Status 500 - could not execute statement;
- 从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
- 动态加载外部程序集并用反射获取指定类型的信息
- 简单工厂(Factory)-提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
- Java反射实现不同对象相同代码地对象查询和封装
- DataTable转任意类型对象List数组-----工具通用类(利用反射和泛型)
- 空间类型和函数不可用于此提供程序,因为未能找到程序集“Microsoft.SqlServer.Types”版本 10 或更高版本。
- C#中使用反射显示程序集的所有类型和属性
- 面向对象之组合、封装、多态性、鸭子类型
- Java反射获得枚举、日期、数字类型对象