JAVA反射机制实操(一)

首先,让我们来谈谈反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能成为java语言的反射机制。

光说不练假把式,那就写个例子吧 :

题目1:运行Robot类中的方法

public class Robot {

    private String name;

    public void sayHello(String str){

        System.out.println(str + " " + name);
    }

    private String throwHello(String str){

        return "Hello" + str;
    }
}

```java
public class ReflectSample {

        public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {

            //获取对象
            Class cls = Class.forName("reflect.Robot");

            //创建实例对象
            Robot r = (Robot)cls.newInstance();

            //根据方法名获取方法
            Method getHello = cls.getDeclaredMethod("throwHello", String.class);

            //设置为true可访问私有方法
            getHello.setAccessible(true);

            //invoke运行该方法
            Object str = getHello.invoke(r,"Bob");

            System.out.println("getHello result is " + str);

            Method sayHello =  cls.getMethod("sayHello", String.class);

            Object obj = sayHello.invoke(r,"阿飞");
            
            System.out.println("sayHello result is " + obj);

            //获取name字段
            Field name = cls.getDeclaredField("name");

            //因为为私有所以 Accessible设置为true
            name.setAccessible(true);

            //将name赋值为梨子果果
            name.set(r,"梨子果果");

            sayHello.invoke(r,"阿飞");



            }

}

结果:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200207220707821.png


题目2:写一个可以在控制台输入类名,动态获取类和类中方法的实例。

```java
public class TestCase {
	
	public void testHello(){
		System.out.println("Hello");
	}

	public void testWho(){
		System.out.println("Who");
	}

	public void demo() {
		System.out.println("demo");
	}	
}
public class Demo02 {

	public static void main(String[] args) throws Exception{
		/**
		 * 动态加载类,并且动态创建对象
		 * 如下代码可以动态加载任何的类,创建其对象
		 * 注意:类型必须有无参数构造器
		 */
		Scanner in = new Scanner(System.in);
		//运行期间通过控制台读取类名
		System.out.print("输入类名:");
		String className=in.nextLine();
		//动态加载类到方法区,类名错误时候抛异常
		Class cls = Class.forName(className);
		//显示加载的结果
		System.out.println(cls);
		//动态创建对象,如果没有无参数构造器时抛异常
		Object obj = cls.newInstance(); //Foo
		//显示创建好的对象 
		System.out.println(obj); 
		
		//动态输入方法名
		System.out.print("输入方法名:");
		String methodName = in.nextLine(); //test
		//根据方法名动态查找方法method
		//getDeclaredMethod 根据给定的方法名查找,不管是不是私有的;不能获取继承、实现的方法
		//一个方法,返回值是一个方法。如果没有找到抛异常
		//getMethod只能获取该类上的public方法,但是能获取继承、实现的方法
		Method method=
				cls.getDeclaredMethod(methodName);
		//开启方法的访问权限,用来访问私有方法
		method.setAccessible(true);
		//动态执行方法, obj 对象上一定要包含指定的方法!
		Object val= method.invoke(obj);
		//val 是方法的返回值,如果没有返回值则为null
		System.out.println(val); 
		
	}
}

结果:在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值