java 反射 基本知识——属性和方法

本文通过一个具体的Java程序实例,详细介绍了如何使用Java反射机制获取类的属性信息,并演示了如何调用类的私有方法及设置私有属性值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package demo;

public class ReflectTest {

	private String name;
	private String type;

	// Constructors
	public ReflectTest() {
		System.out.println("Constructor ReflectTest () is invoking");
	}

	// 私有构造器
	private ReflectTest(String name) {
		this.name = name;
		System.out.println("Constructor ReflectTest(String name) is invoking.");
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	private void say(String str) {
		System.out.println("hello " + str);
	}
	private void see() {
		System.out.println("hello ");
	}
}

 

属性:

这里我将所有的异常都抛出,正常情况下 我们应该在内部将异常处理到,这里只是为了演示所以没有处理。

 

public static void main(String str[]) throws Exception{ 

        Class cls = null

        cls = Class.forName("demo.ReflectTest"); 

        ReflectTest obj = null

        //创建对象 

        obj = (ReflectTest) cls.newInstance(); 

        //取到该类的所有属性 

        Field[] fields = cls.getDeclaredFields(); 

        for (Field f : fields) { 

            System.out.println("完整输出            " + f.toString());  

            System.out.println("类型          " + f.getType().getSimpleName()); 

            System.out.println("属性名         " + f.getName()); 

            System.out.println("修饰符         " + f.getModifiers());                            

            //破处私有权限                                                           

           f.setAccessible(true); 

            System.out.println("属性赋值前:      "+f.get(obj)); 

            f.set(obj, f.getName() + "||" + f.getModifiers()); 

            System.out.println("属性赋值后:      "+f.get(obj)); 

            System.out.println(); 

        } 

        //单去一个属性 

        Field f=cls.getDeclaredField("name"); 

        f.setAccessible(true); 

        System.out.println(f.get(obj)); 

    }

 

输出结果:Constructor ReflectTest () is invoking

完整输出   private java.lang.String demo.ReflectTest.name

类型   String

属性名   name

修饰符   2

属性赋值前:   null

属性赋值后:   name||2

完整输出   public java.lang.String demo.ReflectTest.type

类型   String

属性名   type

修饰符   1

属性赋值前:   null

属性赋值后:   type||1

name||2

修饰符对照表

 

java.lang.reflect.Modifier
public static final intABSTRACT1024
public static final intFINAL16
public static final intINTERFACE512
public static final intNATIVE256
public static final intPRIVATE2
public static final intPROTECTED4
public static final intPUBLIC1
public static final intSTATIC8
public static final intSTRICT2048
public static final intSYNCHRONIZED32
public static final intTRANSIENT128
public static final intVOLATILE64

方法:

Class cls = null;
		cls = Class.forName("demo.ReflectTest");
		ReflectTest obj = null;
		//创建对象
		obj = (ReflectTest) cls.newInstance();
		Method see=cls.getDeclaredMethod("see");
		see.setAccessible(true);
		//输出 hello
		see.invoke(obj);
		Method[] methods =cls.getDeclaredMethods();
		Method getmet=null;
		Method setmet=null;
		for(Method m:methods){
			if("getName".equals(m.getName())){
				getmet=m;
			}
			if("setName".equals(m.getName())){
				setmet=m;
			}
		}
		//没有值 输出null
		System.out.println("getName值:"+getmet.invoke(obj));
		System.out.println("给 Name赋值 setName(“hello word”)");
		setmet.invoke(obj,"hello word");
		System.out.println("getName值:"+getmet.invoke(obj));


输出结果

Constructor ReflectTest () is invoking
hello
getName值:null
给 Name赋值 setName(“hello word”)
getName值:hello word

 

这里的异常也没有处理 因为 只是一个简单的例子,真正开发是 记得要处理异常哦。

 

构造器,属性,方法都能加注解 这个会在注解的篇章里 介绍一下 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值