java中得反射机制

反射机制用来探查java对象得属性

获取Class的3种方法

package reflection;

public class Testreflection {
	public static void main(String[] args) {
		Object person = new Person("xiaoming",22);
		Class c1 = person.getClass(); //获得class方法得第一种方法
		System.out.println(c1.getName());//reflection.Person
		System.out.println(c1.getClass().getName()); //java.lang.Class
		Class c2 = Person.class;   //获取class对象得第二种方法  T.class,T为任意得java关键字
		System.out.println(c2.getName());//reflection.Person
		Class c3 = int.class;
		System.out.println(c3.getName()); //int
		String className = "java.lang.String";
		
		try {
			Class c4 = Class.forName(className);
			System.out.println(c4.getName()); //获取Class得第三种方法
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}

class Person{
	private String name;
	private int age;
	public Person() {
		this.name = "sample";
		this.age = 0;
	}
	public Person(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}

利用Class创建一个类

try {
			Person p1 = (Person) c1.newInstance();
			System.out.println(p1.getName());  //sample
		} catch (InstantiationException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IllegalAccessException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

利用反射分析类的能力

		//c4 = Class.forName(className);  得到String的修饰符
		//c4.getModifiers()是一个数字,Modifier.toString()用来解析该数字
		System.out.println(Modifier.toString(c4.getModifiers()));//public final
还可以在分析类的域,方法,构造器,及他们的参数,返回值类型,修饰符(如果有的话),类的父类。不一一列举了。

利用反射机制操作对象

查看私有变量和修改私有变量的值


		//访问私有变量
		Field f = c1.getDeclaredField("name");
		//name为私有变量,为f赋予权限
		f.setAccessible(true);
		String fname = (String) f.get(person);
		System.out.println(fname);//xiaogming
		//修改私有变量
		f.set(person,"xiaohong");
		System.out.println(person.getName());//小红

利用反射机制调用任意方法

		Method m = c1.getMethod("getName");
		String gname = (String) m.invoke(person);
		System.out.println(gname);//xiaohong

反射对于编写系统程序来说及其实用,但是通常不适合编写应用程序。反射比较脆弱

你可能感兴趣的:(java)