`
com0606
  • 浏览: 60951 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java反射机制和类的封装性

阅读更多
以下是一个关于反射是否破坏了类的封装性的测试

实体类
package cn.henu.lz;

public class Person {
	private String name;
	private int age;
	private String safe;	//该属性无setter和getter方法
	
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
	}
	public String toString() {
		return "姓名:" + this.name + ";年龄:" + this.age;
	}
}


应用
package cn.henu.lz;

import java.lang.reflect.Method;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import cn.henu.lz.Person;
public class Reflect {
	public void getAll(Person person) {
		try {
			Class<?> cla = Class.forName(person.getClass().getName());
			Method m[] = cla.getDeclaredMethods();	//取得当前类的所有方法
			Field f[] = cla.getDeclaredFields();	//取得当前类的所有属性
			
			System.out.println(cla.getSuperclass().getName());	//取得当前类所继承的父类
			System.out.println("--------------------------------");
			
			for(Method i:m) {
				System.out.println(i.getReturnType());
				System.out.println(i);
			}
			
			System.out.println("--------------------------------");
			
			for(Field i:f) {
				System.out.println(String.class);
				System.out.println(i.getName()+"---"+i.getGenericType()+
					"---"+Modifier.toString(i.getModifiers()));
			}
		}catch(ClassNotFoundException ce) {
			ce.printStackTrace();
		}
	}
	
	public void quote(String person) {
		Object obj = null;
		try {
			Class<?> cla = Class.forName(person);
			
			//通过反射引用一个新对象
			Person p = (Person)cla.newInstance();
			p.setName("pp");
			p.setAge(20);
			System.out.println(p);
			
			//以下代码段测试setAccessible()方法的功能
			{
				obj = cla.newInstance();
				Field sf = cla.getDeclaredField("safe");
				sf.setAccessible(true);
				sf.set(obj,"not safe");
				System.out.println(sf.get(obj));
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}


测试
package cn.henu.lz;

import cn.henu.lz.Person;
import cn.henu.lz.Reflect;
public class TestReflect {
	public static void main(String[] args) {
		Person person = new Person();
		Reflect ref = new Reflect();
		ref.getAll(person);
		System.out.println("--------------------------------");
		ref.quote("cn.henu.lz.Person");
	}
}


一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种访问,而由于反射类中的Field,Method和Constructor继承自AccessibleObject,因此,通过在这些类上调用setAccessible()方法,我们可以实现对这些字段的操作。但有的时候这将会成为一个安全隐患,为此,我们可以启用java.security.manager来判断程序是否具有调用setAccessible()的权限。默认情况下,内核API和扩展目录的代码具有该权限,而类路径或通过URLClassLoader加载的应用程序不拥有此权限。例如:当我们以这种方式来执行上述程序时将会抛出异常
> java   -Djava.security.manager   cn.henu.lz.TestReflect
java.security.AccessControlException: access denied (java.lang.reflect.ReflectPe
rmission suppressAccessChecks)
        at java.security.AccessControlContext.checkPermission(AccessControlConte
xt.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:
546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.reflect.AccessibleObject.setAccessible(AccessibleObject.jav
a:107)
        at cn.henu.lz.Reflect.quote(Reflect.java:49)
        at cn.henu.lz.TestReflect.main(TestReflect.java:11)
分享到:
评论

相关推荐

    java反射机制工具类

    在实际应用中,使用反射需要谨慎,因为它可能会破坏代码的封装性和安全性,增加程序的复杂性,并可能导致性能下降。不过,当需要实现动态性、解耦或元编程时,Java反射机制是一个不可或缺的工具。在设计和实现`...

    JAVA反射机制和JDBC和各种数据库的连接

    总结来说,Java反射机制提供了运行时对类的动态访问和操作能力,而JDBC则是Java与数据库交互的桥梁,两者结合,可以在运行时动态地连接不同的数据库并进行数据操作,大大提高了代码的通用性和灵活性。

    java注解、java反射机制 jdbc 封装

    接着,我们来看Java反射机制。反射允许程序在运行时检查类、接口、字段和方法的信息,甚至可以动态调用方法和访问字段。在JDBC封装中,反射非常有用,因为它允许在运行时创建和执行SQL语句,而不必在代码中硬编码...

    候捷谈Java反射机制

    由于反射可以访问私有成员和执行未公开的操作,如果不小心使用,可能会破坏封装性和安全性。因此,在使用反射时,需要谨慎评估其必要性和潜在影响。 总之,Java反射机制是Java语言中一个强大的工具,它增强了Java的...

    java 反射机制详解

    然而,反射也存在一定的性能开销,因为它打破了 Java 的封装性和安全性,可能导致安全风险,因此在使用时需谨慎,避免滥用。 总的来说,Java 反射机制是 Java 动态性的一个重要体现,它提供了在运行时探索和操作类...

    java反射机制 字符串——java对象

    总的来说,Java反射机制和字符串操作是Java开发中不可或缺的部分,它们允许我们实现动态编程,增强程序的灵活性和可扩展性。通过结合XML序列化和解析,我们可以方便地在Java对象和XML数据之间进行转换,这对于数据...

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java 反射机制例子

    2. **安全性问题**:反射可以访问私有成员,这可能破坏封装性和安全性。 3. **可维护性**:过度使用反射会降低代码的可读性和可维护性。 #### 六、总结 Java反射机制是Java语言的一项重要特性,它使得程序能够在...

    一个例子让你了解Java反射机制

    通过8个demo,你可以逐步深入理解Java反射机制,从简单的获取类信息,到创建对象,调用方法,访问字段,再到处理注解和泛型,全方位掌握这一强大的工具。每个demo都应该设计为解决一个特定的问题,例如如何动态调用...

    Java反射机制学习(二)

    Java反射机制允许程序在运行时获取关于类、接口、字段和方法的信息,并且能够动态地调用方法和修改字段值。这极大地增强了代码的灵活性和可扩展性。 2. **Class类**: 所有的Java类都隐式地继承自java.lang.Class...

    Java反射机制Demo

    虽然Java反射机制功能强大,但在实际开发中应谨慎使用,因为它可能破坏封装性,降低程序的可读性和可维护性,还可能带来安全性和性能问题。在非必要情况下,避免使用反射机制,优先考虑其他设计模式和编程技巧。 ...

    Java反射机制课件ppt

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...

    java反射机制讲解

    Java反射机制是Java语言提供的一种强大的能力,它允许我们在运行时检查类的信息并动态地创建和操作对象。这种机制使得程序具有更高的灵活性和扩展性,尤其是在框架开发中有着广泛的应用。 首先,我们要理解反射的...

    java反射机制,很安逸.不要错过

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...

    JAVA 反射机制应用

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是java.lang.Class,它代表了运行时的类信息。通过Class对象,我们...

    java反射机制详解

    ### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...

    Reflection_in_Java.zip_in_java 反射_java 反射机制_java反射_反射机制

    但这应谨慎使用,因为可能会破坏封装性和安全性。 侯捷先生是一位著名的Java技术专家,他的"流星絮语"系列教程深入浅出地讲解了Java反射机制。通过他的学习笔记,我们可以更深入地理解如何在实际项目中应用反射,...

    Java反射机制经典案例

    理解并熟练掌握Java反射机制对于提升代码的灵活性和可扩展性至关重要。然而,反射的使用也应谨慎,因为它可能导致性能下降,增加代码复杂性,并可能破坏封装原则。因此,在实际开发中,应根据具体情况权衡是否使用...

    java反射例子,封装了一个反射帮助类

    总结来说,Java反射提供了一种强大的机制,允许我们在运行时检查和操作类的结构和行为。通过封装反射帮助类,我们可以使这种能力更加易于使用,提高代码的可读性和可维护性。在实际开发中,反射常用于插件系统、序列...

    反射实例-JAVA反射机制.doc

    Java 反射机制详解 ...总结,Java 反射机制是一种强大的工具,能够提升程序的灵活性和可扩展性,但使用时应权衡其性能和安全性的影响。在实际开发中,应该谨慎地使用反射,并尽量将其限制在必要的场景。

Global site tag (gtag.js) - Google Analytics