您的位置:首页 > 其它

反射(提供封装程序集、模块和类型的对象)

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());
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐