
public static void printMethods(Class cl)\x0d\{\x0d\Method[] methods =clgetDeclaredMethods();//返回一个包含方法对象的数组\x0d\for(Method m : methods)//循环该类的每个方法\x0d\{\x0d\Class retType = mgetReturnType();//该方法的返回类型,\x0d\Sting name = mgetName();//获得方法名\x0d\Systenoutprint(" "+ModifiertoString(mgetModifiers());打印方法修饰符\x0d\Systemoutprint(" "+retTypegetName() + " " + name +"(");\x0d\\x0d\Class[] paramTypes = mgetParameterTypes();//获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)\x0d\\x0d\for(int j = 0 ; j 0 ) Systemoutprint(" , "); //如果有多个参数,中间则用逗号隔开,否则直接打印参数\x0d\Systemoutprint (paramTypes[ j ]getName);\x0d\}\x0d\Systemoutprintln (" );");\x0d\}} \x0d\\x0d\//////////getparameterTypes方法用于返回一个描述参数类型的Class对象数组)
2
3import javalangreflectMethod;
4import javalangreflectParameterizedType;
5import javalangreflectType;
6import javautilList;
7import javautilMap;
8
9publicclass TempTest {
10
11publicstaticvoid main(String[] args) throws Exception {
12 Method[] methods = TempTestclassgetDeclaredMethods();
13for (Method method : methods) {
14 Systemoutprintln("method:"+ methodgetName());// 方法名
15
16////////////////方法的参数
17 Systemoutprintln(" paramTypeType: ");
18 Type[] paramTypeList = methodgetGenericParameterTypes();// 方法的参数列表
19for (Type paramType : paramTypeList) {
20 Systemoutprintln(""+ paramType);// 参数类型
21if (paramType instanceof ParameterizedType)/// 如果是泛型类型 /{
22 Type[] types = ((ParameterizedType) paramType)
23 getActualTypeArguments();// 泛型类型列表
24 Systemoutprintln(" TypeArgument: ");
25for (Type type : types) {
26 Systemoutprintln(""+ type);
27 }
28 }
29 }
30
31////////////////方法的返回值
32 Systemoutprintln(" returnType: ");
33 Type returnType = methodgetGenericReturnType();// 返回类型
34 Systemoutprintln(""+ returnType);
35if (returnType instanceof ParameterizedType)/// 如果是泛型类型 /{
36 Type[] types = ((ParameterizedType) returnType)
37 getActualTypeArguments();// 泛型类型列表
38 Systemoutprintln(" TypeArgument: ");
39for (Type type : types) {
40 Systemoutprintln(""+ type);
41 }
42 }
43
44 }
45
46 }
47
48publicstatic String method1(List list) {
49returnnull;
50 }
51
52privatestatic Map<String, Double> method2(Map<String, Object> map) {
53returnnull;
54 }
55
56}
写了个例子,请仔细查看代码,具体过程需要你自己对照java API 再研究,
先定义了一个普通的学生类,如下:
public class Student {private int id;
private String name;
private int age;
private String[] aiHao;
public int getId() {
return id;
}
public void setId(int id) {
thisid = id;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
public String[] getAiHao() {
return aiHao;
}
public void setAiHao(String[] aiHao) {
thisaiHao = aiHao;
}
}
对学生类进行反射
public class Test3 {public static void main(String[] args) {
Student s = new Student();
ssetId(1);
ssetName("张三");
ssetAge(23);
ssetAiHao(new String[] { "足球", "篮球", "上网" });
try {
// 获取所有的变量
Field[] fields = StudentclassgetDeclaredFields();
// 循环处理变量
for (Field f : fields) {
fsetAccessible(true);
Object value = fget(s); // 取变量的值
Systemoutprint("变量名称为:" + fgetName());
if (valuegetClass()isArray()) { // 判断是否是数组
Object[] arr = (Object[]) value; // 装换成数组
Systemoutprintln(",变量值等于:" + ArraystoString(arr));
// 这里还可以做额外处理,判断数组的类型 如下面注释的代码
/
for (Object a : arr) {
Systemoutprintln("参数类型" + agetClass()getName());
// 同样运用反射的机制做额外处理
}
/
} else {
// 非数组类型,普通处理
Systemoutprintln(",变量值等于:" + value);
}
fsetAccessible(false);
}
} catch (Exception e) {
eprintStackTrace();
}
}
}
import javalangreflectConstructor;
import javalangreflectInvocationTargetException;
import javalangreflectMethod;
public class TestReflection
{
public static void main( String[] args ) throws ClassNotFoundException,
InstantiationException, IllegalAccessException, IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException
{
String s = "T";
Class<> c = ClassforName(s);
Constructor<>[] consts = cgetConstructors();
// 定义有参构造
Constructor<> consts1 = null;
for( int i = 0; i < constslength; i++ )
{
int paramsLength = consts[i]getParameterAnnotations()length;
if(paramsLength > 0)
{
// 判断参数长度取得有参构造
consts1 = consts[i];
}
}
// 得到有参构造参数类型
Class<>[] type = consts1getParameterTypes();
// 实验性数据
Object[] values = { "A", "B", "C" };
// 得到对象
Object obj = cgetConstructor(type)newInstance(values);
Systemoutprintln(objgetClass()getMethod("getA")invoke(obj));
Systemoutprintln(objgetClass()getMethod("getB")invoke(obj));
Systemoutprintln(objgetClass()getMethod("getC")invoke(obj));
}
}
class T
{
private String a;
private String b;
private String c;
public T()
{
Systemoutprintln("T() was loaded");
}
public T( String a, String b, String c )
{
Systemoutprintln("T(String s) was loaded");
thisa = a;
thisb = b;
thisc = c;
}
public String getA()
{
return a;
}
public void setA( String a )
{
thisa = a;
}
public String getB()
{
return b;
}
public void setB( String b )
{
thisb = b;
}
public String getC()
{
return c;
}
public void setC( String c )
{
thisc = c;
}
}
反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分。
1获得方法包括获得方法的名称,方法的返回类型,方法的访问修饰符,以及通过反射执行这个方法。
2获得属性包括属性的名称,类型,访问修饰符,以及这个属性的值。
这些获得都有相应的API提供 *** 作。
举个例子:
先定义一个类,有age这个属性,以及age的get和set方法:
public class TestRflectionFather {
public int age =32;
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
}
然后 *** 作获得所有方法:
import javalangreflectMethod;
public class Testmain {
public static void main(String[] args) throws Exception {
Class clazz = ClassforName("TestRflectionFather");
Method[] methods =clazzgetDeclaredMethods();
for(Method me:methods)
{
Systemoutprintln(megetName());
}
}
}
//最后输出
getAge
setAge
GetConstructor的时候传递相应的参数类型,获得指定的构造函数,再调用构造函数时传递指定参数
例:要构造如下的类:
class A
{
string _v;
public A(string v)
{
_v = v;
}
}
//代码如下:
var type = typeof(A);
var con = typeGetConstructor(new Type[] { typeof(string) });
A a = conInvoke(new object[] { "I'm a string" }) as A;
以上就是关于java反射获得方法名后怎样判断方法是否含有参数全部的内容,包括:java反射获得方法名后怎样判断方法是否含有参数、java反射如何根据方法返回类型来接收方法的返回值可以获取到方法名,返回值类型。、java如何利用反射机制得到一个类中为数组类型的成员变量的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)