java反射机制

反射机制的定义:

Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。

反射机制有什么作用?

1.通过反射可以扩展未知的应用;

2.通过反射可以调用任意一个类的属性和方法;

那么接下来就是练习了:

练习的内容主要是通过反射机制能够访问到另一个类的内容;

一.首先我新建一个类名为test,在类中我定义了类的私有方法,公有方法,还有私有属性,公有属性

下面是代码:

package Reflect;

public class test {
//定义了一个公有属性
public String m="M";
//定义了了一个私有属性
private String n="N";
public test(){
	System.out.println("成功调用无参公有构造方法");
}
private test(String s){
	System.out.println("成功调用有参私有构造方法");
}
public void example1(){
	System.out.println("成功调用无参的公有方法");
}
private void example2(){
	System.out.println("成功调用无参的私有方法");
}
public void example3(String m){
	System.out.println("成功调用有参的公有方法"+m);
}
private void example4(String n){
	System.out.println("成功调用有参的私有方法"+n);
}
}

二.创建另一个类reflect,通过反射机制反射机制访问上述test类的公有,私有属性和方法;

下面是代码,看不太懂的希望能多看两遍代码中的注释,还是可以懂得,谢谢配合:

package Reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class reflect {
public static void main(String []args){
	
		try {
			//获取test类的Class对象
			Class c = Class.forName("Reflect.test");
			//获取test类的公有构造方法
			Constructor constr=c.getConstructor();
			//获取test类中的私有构造方法,通过test类可知它的形参是一个字符串型的数据
			Constructor constr1=c.getDeclaredConstructor(String.class);
			//取消java的访问检查
			constr1.setAccessible(true);
			//创建对象
			Object obj =constr.newInstance();
			Object obj1=constr1.newInstance("nice");
			//通过Class类获取属性
			//公有属性
			try {
				//获取test类中的公有属性
				Field field1=c.getField("m");
				//输出test类中的公有属性值
				System.out.println(field1.get(obj));
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//私有方法
			try {
				//获取test类中的私有属性
				Field field2=c.getDeclaredField("n");
				field2.setAccessible(true);
				//输出test类中的私有属性值
				System.out.println(field2.get(obj1));
			} catch (NoSuchFieldException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//调用类的方法
			//获取test类中无参公有方法
			Method m = c.getMethod("example1");
			//获取test类中无参私有方法
			Method m1=c.getDeclaredMethod("example2");
			
			//该方法表示取消java语言访问检查
			m1.setAccessible(true);
			//获取test类中有参公有方法
			Method m2=c.getMethod("example3",String.class);
			//获取test类中有参私有方法
			Method m3=c.getDeclaredMethod("example4",String.class);
			//取消java的访问检查
			m3.setAccessible(true);
			//调用无参方法
			m.invoke(obj);
			m1.invoke(obj1);
			//调用有参方法,需要加入对应的参数类型的数据
			m2.invoke(obj1, "没问题");
			m3.invoke(obj1, "很正确");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}
}

 

你可能感兴趣的:(反射机制)