欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java反射机制

程序员文章站 2024-01-20 12:44:04
...

反射机制的定义:

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();
		}
}
}

 

相关标签: 反射机制