`
com0606
  • 浏览: 60385 次
  • 性别: 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开发技术大全(500个源代码).

    示例描述:本章学习对象和类。 accessMember.java 访问成员变量示例 constructNoPara.java 无参数的构造方法 constructWithPara.java 带参数的构造方法 declareDefault.java 缺省访问权限的使用 declarePrivate...

    JAVA_API1.6文档(中文)

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...

    java学习:05.Java注解和反射.md

    这些特性使得Java程序具有良好的可维护性、可扩展性和代码重用性。同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和...

    java和android 通用的rsa 加密封装 .zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java 1.6 API 中文 New

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...

    Java开发详解.zip

    031503_【第15章:Java反射机制】_反射应用——取得类的结构笔记.pdf 031504_【第15章:Java反射机制】_Java反射机制的深入研究笔记.pdf 031505_【第15章:Java反射机制】_动态代理笔记.pdf 031506_【第15章:Java...

    java api最新7.0

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中显示...

    JavaAPI1.6中文chm文档 part1

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...

    Java 基础面试题

    30. 反射机制以及反射的方式 31. 类加载有几种方式 32. Class.forName()和ClassLoader.loadClass()的区别 34. 如何防止创建的类名不能java为已有类名,Java加载双亲委派机制 35. 堆和栈的区别

    (JAVA 版本的 官方经典PHash算法).zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    基于中科院seetaface6进行封装的JAVA人脸识别算法库.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    国密算法sm2、sm3和sm4的java版。基于js版本进行封装,无缝兼容js版公私钥加解密。.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java加密,实现Cipher类支持的加密算法.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    疯狂JAVA讲义

    3.7.8 运算符的结合性和优先级 69 3.8 本章小结 70 本章练习 70 第4章 流程控制和数组 71 4.1 顺序结构 72 4.2 分支结构 72 4.2.1 if条件语句 72 4.2.2 switch分支语句 76 4.3 循环结构 78 4.3.1 while循环...

    java数据结构和算法实现.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    java基础案例与开发详解案例源码全

    15.2 使用Java反射机制414 15.2.1 获取类型信息414 15.2.2 创建对象417 15.2.3 调用方法419 15.2.4 访问成员变量的值421 15.2.5 操作数组422 15.3 反射与动态代理424 15.3.1 静态代理424 15.3.2 动态代理426 15.4 本...

    用java实现的贝叶斯分类算法。用于大数据的分类。.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java数据结构和算法系列文章,源码.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    JavaAPI中文chm文档 part2

    java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个与 GUI 中...

    Java 和 js 实现 AES 和 RSA 算法的互加解密.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

Global site tag (gtag.js) - Google Analytics