2、java.lang.Class之Field/Method/Constructor

博客提及了Java中的java.lang.reflect.Field。在Java里,反射机制是重要特性,Field类可用于在运行时获取和操作类的字段,这在很多场景下有重要应用。

java.lang.reflect.Field

 

package com.woniu.vul; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; class Test{ public String name = "蜗牛学苑"; public int age = 8; private String addr = "西安"; private int price = 10000; public Test() { } public Test(int price){ this.price = price; } public int setPrice(int price){ System.out.println("新价格为:" + price); return price; } public int getPrice(){ return this.price; } private void getAddr(){ System.out.println("私有方法:" + addr); } } public class Reflect { public static void main(String[] args) throws Exception { /*Test t = new Test(); System.out.println(t.getPrice()); Test t1 = new Test(15000); System.out.println(t1.getPrice()); System.out.println(t.name); */ //使用反射机制实现属性和方法的调用(包括构造方法) //使用Class.forName可以获取到类本身,在JVM中动态加载Test类 //Class clazz = Class.forName("com.woniu.vul.Test"); //Class clazz = Test.class; //使用new Instance进行实例化 //Test t = (Test) clazz.newInstance(); //System.out.println(t.getPrice()); //Object o = clazz.newInstance(); //实例化动态加载的类,类型必须是Object // Method m1 = clazz.getMethod("getPrice"); // int price1 = (int)m1.invoke(o,null); // System.out.println(price1); // // Method m2 = clazz.getMethod("setPrice",int.class); // int price2 = (int)m2.invoke(o,15000); // System.out.println(price2); //调用price私有属性和getAddr私有方法,getFiled只能调用公有属性,getDeclareField才能调私有属性 //Field f1 = clazz.getDeclaredField("price"); //f1.setAccessible(true); //设置私有属性可访问 //System.out.println(f1.get(o)); //getMethod只能调用公有方法,而getDeclareMethod才能嗲用私有方法 //Method m1 = clazz.getDeclaredMethod("getAddr"); //m1.setAccessible(true); //m1.invoke(o,null); //构造方法如果有参数,怎么办? Class clazz = Class.forName("com.woniu.vul.Test"); Constructor c = clazz.getConstructor(int.class); //获取到一个带参数的构造器 Object o = c.newInstance(10); //用构造器去构造一个动态加载的类 Method m1 = clazz.getDeclaredMethod("getPrice"); int price = (int) m1.invoke(o,null); System.out.println(price); //遍历所有方法或操作 Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method + " " + method.getName() + " " + method.getModifiers()); } Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { System.out.println(field + " " + field.getName() + " " + field.getModifiers()); } } } 解释以上代码
06-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值