java反射入门简单速成

java反射入门速成:

知晓对象里面的值:

    public <T> void Test(T t) throws IllegalAccessException{
        Class<T> cls=(Class<T>) t.getClass();
        Field[] fields=cls.getDeclaredFields(); //只获取声明过的属性
        for (int i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);  //暴力获取私有属性
            Object value=fields[i].get(t);
            System.out.println(fields[i].getName()); // 属性名
            System.out.println(fields[i].getType()); //属性的基本数据类型
            System.out.println(value);  //属性值
            //获取访问修饰符
			int mod = fields[i].getModifiers();
			String modify = Modifier.toString(mod);
			
			 //通过属性名将值注入到对象里面(注意传入数据类型要与声明数据类型一致)
            if(fields[i].getType().equals("你声明的属性名称")){
                fields[i].set(t,1);
            }
        }
    }

例子:

Bean bean=new Bean();
 new Test().Test(bean);

动态调用对象

/**
     *
     * @param clazz 类路径
     * @param methodName 类所属的方法名
     * @param args 所属方法对应的参数数组  Object [] args1={args,args};
     * @throws ClassNotFoundException
     */
    public void invokeMethod(String clazz,String methodName,Object[] args) throws ClassNotFoundException,InstantiationException,IllegalAccessException, InvocationTargetException {
        Class<?> cls=Class.forName(clazz);
        Method[] methods=cls.getDeclaredMethods();
        for (int i = 0; i < methods.length ; i++) {
            Method method=methods[i];
            
            //方法修饰符是私有的需要配置这个
            method.setAccessible(true);
            if(method.getName().equals(methodName)){
                
                //调用指定的方法
               Object value=method.invoke(cls.newInstance(),args);

                //value 为方法执行后的结果,具体结果看你声明的返回值类型
                // 如果返回数据类型是void 则value为null
               System.out.println(value);
               
            }
        }
    }

例子:

public class TestMain  {

    private void TestOne(String s1,String s2){
        System.out.println(s1+":"+s2);
    }
}

 Object [] value={"hello","world"};
 new Test().invokeMethod("com.sxt.Test.TestMain","TestOne",vaue);

通过类路径任意创建对象(无参):

 public <T> T TestTwo(String clazz) throws ClassNotFoundException, IllegalAccessException,InstantiationException{
        Class<?> cls=Class.forName(clazz);
        return (T)cls.newInstance();
 }

通过类路径任意创建对象(有参):

public <T> T TestTwo(String clazz,Class[] args2,Object[] args) throws ClassNotFoundException, IllegalAccessException,InstantiationException
    ,InvocationTargetException,NoSuchMethodException{
        Class<?> cls=Class.forName(clazz);
        Constructor c2=cls.getConstructor(args2);
        return (T)c2.newInstance(args);
}

例子:

public class TestBean {

    private Integer id;

    private String name;
   
    //省略set和get方法
    
    public TestBean(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

	 public TestBean() {
     }
    
}
 Object[] arg={1,"小明"};
 Class[] arg2={Integer.class,String.class};
 TestBean t=new Test().TestTwo("com.sxt.Test.TestBean",arg2,arg);
 System.out.println(t);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值