java反射机制

一.测试用的实体类(ClassInvoke.java):

package com.szy.project.entity;

public class ClassInvoke {

	private static String name;
	
	public void test(){
		System.out.println("Test ----  Class.invoke()!");
	}
	
	private String sayHello(String str){
		return "hello:"+str;
	}
	
	public String getName(){
		return name;
	}
	
}

    二.反射机制:获得需要实例化的Class,然后再通过Instance(),方法获得示例;

    1.通过引用获得Class:

    这种方式已经通过new的方式获得了示例,再通过反射的方式去获得示例显得有点多余,不建议使用;

ClassInvoke test = new ClassInvoke(); 
Class<ClassInvoke> test1 = (Class<ClassInvoke>)test.getClass();

    2.通过forName获得示例对象:

    注意:forName()方法中的参数是全类名;

Class<ClassInvoke>test1 = (Class<ClassInvoke>)Class.forName("com.szy.project.entity.ClassInvoke");

    3.通过.class获得Class:

Class test1 = ClassInvoke.class;

三.获得示例,执行方法:

ClassInvoke test = new ClassInvoke(); 
Class<ClassInvoke> test1 = (Class<ClassInvoke>)test.getClass();
ClassInvoke test2;
test2 = test1.newInstance();
test2.test();
Class<ClassInvoke>test1 = (Class<ClassInvoke>)Class.forName("com.szy.project.entity.ClassInvoke");
ClassInvoke test2 = test1.newInstance();
test2.test();
Class test1 = ClassInvoke.class;
ClassInvoke test2 = (ClassInvoke)test1.newInstance();
test2.test();

四.访问私有属性:

两种方式:访问静态属性和非静态变量;

访问测试类ClassInvoke.java中非静态属性sayHello():

try {
	Class test = Class.forName("com.szy.project.entity.ClassInvoke");
	Method method = test.getDeclaredMethod("sayHello", new Class[]{String.class});
	Object invoke = (String)method.invoke(test.newInstance(), new Object[]{"szy!"});//访问非静态属性需要获得示例
	System.out.println(invoke);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

访问测试测试类中的静态变量name:

try {
    Class test = Class.forName("com.szy.project.entity.ClassInvoke");
    Field field = test.getDeclaredField("name");
    field.setAccessible(true);
    field.set(test, "szy");
    System.out.println(field.get("name"));
} catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e ) {
	// TODO Auto-generated catch block
        e.printStackTrace();
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值