反射(reflect)调用方法属性

package com.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflect {

/**
* 两种构造方式
* 调用方法(普通,静态,私有,有返回值,main)
* 注意:在调用私有方法时要设置权限打开
* 在调用方法时,要么直接用clazz.getethod()或者用o.getclass().getethod()
* 调用main方法时要将数组封装成一个object,否则会被拆开处理
*
* 若是一般方法
* Method m=clazz.getMethod("print");
* 相当于Person.print()方法
*
* 而static方法m=clazz.getMethod("say");
* 也相当于Person.say()方法
* 因为是静态方法,所以Person.say()可以直接执行,所以可以不传对象
* 而一般方法必须由对象调用,所以必须传一个对象
* @param tww
*/
public static void main(String[] args) {

try {
Class clazz=Class.forName("com.reflect.Person");
//两种构造对象
//1。
Object o=clazz.newInstance();

//2.构造方法
Constructor c=clazz.getConstructor();
Person p=(Person) c.newInstance();
p.print();

//调用public方法
Method m=clazz.getMethod("print");
m.invoke(o);

//调用private方法
m=clazz.getDeclaredMethod("eat");
//打开访问权限
m.setAccessible(true);
m.invoke(o);

//调用public static方法
m=clazz.getMethod("say");
m.invoke(null);

//调用有参的构造方法
m=o.getClass().getMethod("gets", String.class);
String s=(String) m.invoke(o, "gets");
System.out.println(s);

//调用main方法,注意要将数组转成一个整体
m=clazz.getMethod("main", String[].class);
m.invoke(null, (Object)new String[]{"aa","bb"});


//获取属性(private)
Person p1=new Person("mike");
Field f=clazz.getDeclaredField("name");
//权限打开
f.setAccessible(true);
//获取属性值
String name=(String) f.get(p1);
//获取属性类型
Class type=f.getType();
//可用于判断类型
System.out.println(String.class.equals(type));
System.out.println(type);
System.out.println(name);
} catch (Exception e) {
e.printStackTrace();
}
}
}

转载于:https://www.cnblogs.com/JavaTWW/p/4439244.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值