`

JAVA Reflection(反射机制)续

 
阅读更多

接上一篇文章  JAVA Reflection(反射机制)

 

动态数组

 

java.lang.reflect.Array

static Object set(Object array, int index, Object newValue)

Static Object setXxx(Object array, int index, Xxx newValue)

这些方法将一个新值存储到给定位置上的给定数组中。

其中xxx代表boolean、btye 、double、float、int、long、short中的其中一种

static Object get(object array, int index)

static xxx getXxx(Object array, int index)

这些方法将返回存储在给定位置上的给定数组的内容。

 

 

动态创建和访问数组元素

 

import java.lang.reflect.*; 
public class ArrayTester1 { 
    public static void main(String args[])throws Exception { 
        Class classType = Class.forName("java.lang.String"); 
        //创建一个长度为 10 的字符串数组 
        Object array = Array.newInstance(classType, 10); 
        //把索引位置为 5 的元素设为"hello" 
        Array.set(array, 5, "hello"); 
        //读取索引位置为 5 的元素的值 
        String s = (String) Array.get(array, 5); 
        System.out.println(s); 
    } 
} 
 

 

检查类结构

 

public static void printConstructors(Class cl) {
	Constructor[] constructors = cl.getDeclaredConstructors();
	for (Constructor c : constructors) {
		String name = c.getName();   
		System.out.println(" ");
		String modifiers = Modifier.toString(c.getModifiers());
		if (modifiers.length() > 0)  
			System.out.println(modifiers + " ");
		System.out.println(name + "(");
		Class[] paramTypes = c.getParameterTypes();
		for (int j = 0; j < paramTypes.length; j++) {
			if (j > 0)	System.out.println(", ");
			System.out.println(paramTypes[j].getName());
		}
		System.out.println(");");
	}
}
 

 

 

public static void printMethods(Class cl) {
	Method[] methods = cl.getDeclaredMethods();
	for (Method m : methods) {
		Class retTye = m.getReturnType();
		String name = m.getName();
		System.out.print(" ");
		String modifiers = Modifier.toString(m.getModifiers());
		if (modifiers.length() > 0) 
			System.out.print(modifiers + " ");
		System.out.print(retTye.getName() + " " + name + "(");
		Class[] paramTypes = m.getParameterTypes();
		for (int j = 0; j < paramTypes.length; j++) {
			if (j > 0)
				System.out.print(", ");
			System.out.print(paramTypes[j].getName());
		}
		System.out.println(");");
	}
}
 

 

 

public static void printFields(Class cl) {
	Field[] fileds = cl.getDeclaredFields();
	for (Field f : fileds) {
		Class type = f.getType();
		String name = f.getName();
		System.out.print(" ");
		String modifiers = Modifier.toString(f.getModifiers());
		if (modifiers.length() > 0)
			System.out.print(modifiers + " ");
		System.out.println(type.getName() + " " + name + ";");
	}
}
 

 

 

public static void main(String[] args) {
	String name;
	if (args.length > 0)
		name = args[0];
	else {
		Scanner in = new Scanner(System.in);
		System.out.println("Enter class name (e.g. java.util.Date): ");
		name = in.next();
	}
	try {
		Class cl = Class.forName(name);
		Class supercl = cl.getSuperclass();
		String modifiers = Modifier.toString(cl.getModifiers());
		if (modifiers.length() > 0)
			System.out.print(modifiers + " ");
		System.out.print("class " + name);
                if (supercl != null && supercl != Object.class)
			System.out.println(" extends " + supercl.getName());
		System.out.print("\n{\n");
			
		printConstructors(cl);
		System.out.println();
		printMethods(cl);
		System.out.println();
		printFields(cl);
		System.out.println("}");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
	System.exit(0);
}
 

 

检查类结构——输出示例

 

Enter class name (e.g. java.util.Date): 
com.ht.Customer
public class com.ht.Customer
{
 public com.ht.Customer(java.lang.String, int);
 public com.ht.Customer();
 public void setId(java.lang.Long);
 public int getAge();
 public void setAge(int);
 public java.lang.String getName();
 public java.lang.Long getId();
 public void setName(java.lang.String);

 private java.lang.Long id;
 private java.lang.String name;
 private int age;
}
 

 

访问权限控制

 

public class AccessTester {
	public static void main(String[] args) {
		try {
		Customer customer = new Customer("success", 10);
		Class cl = customer.getClass();
		Field f = cl.getDeclaredField("name");
		Object v = f.get(customer);
		System.out.printf(v);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
抛出异常:
java.lang.IllegalAccessException:  Class com.ht.AccessTester can not access

a member of class com.ht.Customer with modifiers "private"

 

 

反射机制默认的行为受限制于Java的访问控制。

Java安全机制只允许查看任意对象有哪些值,而不允许读取它们私有域的值。

Java允许通过覆盖访问控制来脱离安全管理器的控制。  setAccessible(true);

 

 

 

java.lang.reflect.AccessibleObject

void setAccessible(boolean flag)

为反射对象设置可访问标志。Flag为true表明屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置。

Boolean isAccessible()

返回反射对象的可访问性标志的值。

static void setAccessible(AccessibleObject[] array, boolean flag)

一种设置对象数组可访问标志的快捷方式

 

 

public class AccessTester {
	public static void main(String[] args) {
		try {
		Customer customer = new Customer("success", 10);
		Class cl = customer.getClass();
		Field f = cl.getDeclaredField("name");
		f.setAccessible(true);		
		Object v = f.get(customer);
		System.out.println(v);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 

 

输出:success

 

java反射小结

1. 只要用到反射,先获取Class Object;

2. 没有方法能够获得当前类的超类的private方法和属性,你必须通过getSuperClass()找到超类以后再去尝试获得;

3. 通常情况即使是当前类,private属性或方法也是不能访问的,你需要设置压制权限setAccessible(true)来去的private的访问权。但是这样已经破坏了面向对象的规则,所以除非万不得已,尽量少用。建议采用Java Bean 方法,如get***()和set***()。

 

分享到:
评论

相关推荐

    javaReflection反射机制.ppt

    之前上课的时候老师总结的JavaReflection反射学习资料,内容简单易懂,浅显易懂,适合小白入手学习。。

    java reflection反射机制示例

    Java反射机制是Java编程语言中的一个强大工具,它允许运行时动态访问类的信息,包括类名、属性、方法以及构造器等。通过反射,我们可以在程序执行过程中创建和操作任何类的对象,即使在编译时未知该类的具体信息。...

    java Reflection 反射机制 反编译

    import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; public class ReflectionTest { public static void main(String[] args) { Class c = null; try { ...

    java面试题--反射机制

    ### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...

    Java反射机制的实现_Reflection

    Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...

    JAVA 私塾笔记整理——反射机制(Reflection)

    在"JAVA私塾笔记整理——反射机制(Reflection)"这份文档中,我们将深入探讨反射机制的基础知识、用途和实现方式。 1. **反射机制的基本概念** 反射机制是Java提供的一种能够在运行时分析类和对象的能力。它允许...

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

    Java反射机制是Java编程语言中一个强大的特性,它允许运行时的程序动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包下的类如`Constructor`、`Method`和`...

    Java Reflection (JAVA反射)

    ### Java反射机制详解 #### 一、Java反射机制概述 反射是Java编程语言的一个关键特性,它赋予了Java程序在运行时自我检查的能力,并能够直接操纵程序内部的属性。通过反射,开发者可以在运行时获取类的信息(如...

    java的反射机制及其实际应用

    ### Java的反射机制及其实际应用 #### 一、引言 Java作为一种强大的编程语言,提供了许多高级特性,其中反射机制尤为突出。通过反射,开发者可以在运行时动态地获取类的信息并操纵类的行为,从而实现更加灵活和...

    Java反射机制 Java反射机制

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...

    Java Reflection in Action

    Java Reflection in Action这本书作为Java反射机制的经典之作,详细介绍了反射技术的应用和相关的概念基础,是Java开发者的必备书籍。 首先,反射允许开发者在不知道对象具体类型的情况下,通过类名获取类类型,...

    Java中的反射机制

    ### Java中的反射机制 #### 一、反射的概念 反射的概念最早由Smith于1982年提出,是指程序能够访问、检测和修改其自身状态或行为的能力。这一概念的引入促进了计算机科学领域对反射性的研究,并迅速被应用于程序...

    java reflection in action

    在《Java Reflection in Action》这本书中,作者深入探讨了这一主题,帮助开发者理解并有效地利用Java反射机制。这本书是2005年出版的英文版,对于想要提升Java编程技能,特别是对动态类型和元编程感兴趣的开发者来...

    反射实例-JAVA反射机制

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

    java的反射机制

    ### Java的反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言提供的一种能在运行时分析和操作类、对象、方法等的能力。它使得开发人员可以在程序运行过程中动态地获取类的信息(例如类名、字段、...

    Java反射机制

    ### Java反射机制详解 #### 一、什么是Java的反射机制 Java反射机制是Java语言的一种重要特性,使得Java成为了一种动态性很强的语言。通过反射,可以在程序运行时获取类的信息,包括类名、父类、接口、字段、方法...

    候捷谈Java反射机制

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...

    Java反射机制及各成份所对应的Reflection APIs

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射API,开发者可以获取到类的内部细节,包括访问修饰符、超类、实现的接口,以及字段和方法的详细...

Global site tag (gtag.js) - Google Analytics