您的位置:首页 > 其它

反射之字段、方法、构造器的调用(二)

2017-12-24 14:00 225 查看
作者:叁念

反射之字段、方法、构造器的调用(二)

本文接上一篇文章 :反射的概念以及获取方法(一) 点击跳转

1.Class类型 - 类的类型

获取类型对象

1. Class.forName(完整类名)

2. 类名.class

3. 对象.getClass()

常用方法

getName() 获取完整类名

getSimpleName() 获取简单类名

getDeclaredFields() 获取类中所有属性

getDeclaredMethods() 获取类中所有方法

getDeclaredConstructors() 获取类中所有构造器

newInstance() 实例化类的对象(公开的无参构造)

2.Field类型 - 属性的类型

常用方法

getName() 获得属性名

getType() 获得属性的类型

get(Object obj) 获取obj对象中的这个属性的值

set(Object obj, Object value) 将obj对象中这个属性的值设置为value

setAccessible(true) 允许访问

package com.sannian;

import java.lang.reflect.Field;

public class Demo01 {
public static void main(String[] args) {
/*******************  使用字段  *************************/
try {
Class<?> c = Class.forName("com.sannian.Student");
/**构造对象*/
Object student = c.newInstance();
//输出:com.sannian.Student
//          System.out.println(student.getClass().getName());

/**设置name字段*/
/**拿出name这个属性的对象*/
Field name = c.getField("name");
/**把张三放入student对象的姓名字段*/
name.set(student, "张三");
/**取出student对象的姓名字段*/
Object obj = name.get(student);
//输出:张三
System.out.println(obj);

/**设置age字段*/
Field age = c.getField("age");
age.set(student, 18);
/**取出age字段并打印*/
System.out.println(age.get(student));

/**设置私有的money字段*/
Field money = c.getDeclaredField("money");
money.setAccessible(true);
money.set(student, 100);
System.out.println(money.get(student));

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}

}
}


3.Method类型 - 方法的类型

常用方法

getName() 获取方法名称

getReturnType() 获取返回值类型

invoke(Object obj, Object… args) 调用obj对象的
b3e0
这个方法,参数列表为args

getTypeParameters() 获取参数列表

package com.sannian;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Demo03 {
/*******************  通过反射调用方法  *************************/
public static void main(String[] args) {
try {
Class<?> c = Class.forName("com.sannian.Student");
Object student = c.newInstance();

/**获取introduce方法,无参数,无返回值*/
Method introduce = c.getMethod("introduce", null);
introduce.invoke(student, null);

/**获取say方法,有一个String参数,无返回值*/
Method say = c.getMethod("say", String.class);
say.invoke(student, "用放射调用的方法");

/**获取add方法,有2个int参数,有一个int返回值*/
//          Method add = c.getMethod("add", int.class,int.class);  //写法一
Method add = c.getMethod("add", new Class[]{int.class,int.class});//写法一
Object obj = add.invoke(student, 1,2);
//          Object obj = add.invoke(null, 1,2);  //因为static 所以可不不传入对象
System.out.println(obj);

/**获取私有play方法*/
Method play = c.getDeclaredMethod("play", null);
play.setAccessible(true);
play.invoke(student, null);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}


package com.sannian;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;

public class Demo04 {
public static void main(String[] args) {
try {
Class<?> c = Class.forName("com.sannian.Student");
//读取所有构造器
Constructor<?>[] constructors = c.getConstructors();
for (int i = 0; i < constructors.length; i++) {
String modi = Modifier.toString(constructors[i].getModifiers());

String list = "(";
Class<?>[] parameterTypes = constructors[i].getParameterTypes();
for (int j = 0; j < parameterTypes.length; j++) {
list += parameterTypes[j].getSimpleName();
if(j < parameterTypes.length - 1) {
list += ",";
}
}
list += ")";

System.out.println(modi + " " + c.getSimpleName() + " " + list);
}
//分别调用
//1.无参构造
//          Object o1 = c.newInstance();
Constructor<?> con0 = c.getConstructor();
Object obj1 = con0.newInstance();

//2.有参构造
Constructor<?> con1 = c.getConstructor(String.class);
Object obj2 = con1.newInstance("张三");

//3.2个参数构造
Constructor<?> con2 = c.getConstructor(String.class,int.class);
Object obj3 = con2.newInstance("李四",18);

System.out.println(obj1);
System.out.println(obj2);
System.out.println(obj3);

} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐