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***()。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值