黑马程序员技术交流社区
标题:
java反射问题
[打印本页]
作者:
吴雨翔
时间:
2011-11-25 19:14
标题:
java反射问题
本帖最后由 吴雨翔 于 2011-11-25 19:28 编辑
老师讲的不好理解,谁给一个简单的反射实例
作者:
侯伟浩
时间:
2011-11-25 19:19
一个简单的通过反射机制得到String的所有构造方法:
public class My2 {
public static void main(String args[])
{
Class cl=String.class;
Constructor[] cons=cl.getConstructors();
for(Constructor con:cons)
{
System.out.println(con.toString());
}
}
}
复制代码
作者:
侯伟浩
时间:
2011-11-25 19:21
一个简单的通过反射机制得到String的所有方法:
public class My2 {
public static void main(String args[])
{
Class<?> cl=String.class;
Method[] methods=cl.getMethods();
for(Method method:methods)
{
System.out.println(method.toString());
}
}
}
复制代码
作者:
侯伟浩
时间:
2011-11-25 19:39
通过反射机制得到往ArrayList<Integer>中加入String元素:
public class My2 {
@SuppressWarnings("unchecked")
public static void main(String args[]) throws Exception
{
ArrayList<Integer> array=ArrayList.class.newInstance();
Method method=array.getClass().getMethod("add", Object.class);
method.invoke(array, "abc");
System.out.println(array.get(0));
}
}
复制代码
作者:
侯伟浩
时间:
2011-11-25 19:45
来个复杂的—通过反射为JavaBean中的属性赋值:
public class My2 {
public static void main(String args[]) throws Exception
{
Person per=new Person();
PropertyDescriptor pd=new PropertyDescriptor("name",Person.class);
Method setMethod=pd.getWriteMethod();
setMethod.invoke(per, "Jim");
System.out.println(per.getName());
}
}
class Person
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
复制代码
作者:
王丰盛568
时间:
2011-11-25 20:38
.反射
1.获取Class对象:
Class类是用来描述一个类的类, 当程序运行时虚拟机加载.class文件到内存中, 在内存中这些.class文件就是Class类的对象.
我们如果获得了Class对象, 就可以使用这个对象的newInstance()方法来创建该类的实例.
获取Class对象的方式有3种:
a.通过字符串获取: Class.forName(String)
b.通过类名直接获取: 类名.class
c.通过对象获取: 对象.getClass()
2.构造函数Constructor:
如果一个Class对象中有无参构造函数, 那么可以直接使用Class对象的newInstance()方法来创建对象.
但是如果没有无参的构造函数, 那么就需要调用其有参的构造函数来创建对象了.
使用Class类的getConstructor(Class...)方法获取到指定的构造函数.
通过Construtor类的newInstance(Object...)方法来调用构造函数创建对象.
3.方法Method:
我们可以通过Class对象获取一个类中的方法. 获取到方法之后可以运行该方法.
可见的方法:
通过Class类的getMethod(String, Class...)方法获取指定的方法.
通过Method的invoke(Object, Object...)方法调用该方法.
类中定义的方法(包括不可见的):
通过Class类的getDeclaredMethod(String, Class...)方法获取到该类定义的一个方法
如果该方法是一个不可见的方法, 那么需要设置该方法的可见性, setAccessible(boolean)
4.属性Field:
我们可以通过Class对象获取该类中的属性, 可以设置或获取该属性的值.
可见的属性:
通过Class对象的getField(String)方法获取到Field对象
通过Field对象的set(Object, Object)设置该属性的值
类中定义的(包括不可见的):
通过Class对象的getDeclaredField(String)方法获取到Field对象
如果该属性是不可见的, 那么需要设置可见性才能操作. setAccessible(boolean)
/*
* Person 类用来描述人
* Student 类用来描述学生
* String 类用来描述字符串
* Class 类用来描述所有的.class文件
*/
public class ClassDemo {
public static void main(String[] args) throws Exception {
// demo1();
// demo2();
// demo3();
// demo4();
}
private static void demo4() throws ClassNotFoundException {
Apple apple = new Apple();
Class clazz1 = Class.forName("cn.itcast.day29.reflect.Apple");
Class clazz2 = Apple.class;
Class clazz3 = apple.getClass();
System.out.println(clazz1);
System.out.println(clazz2);
System.out.println(clazz3);
System.out.println(clazz1 == clazz2);
System.out.println(clazz2 == clazz3);
// 以上3种方式获取的都是Apple类, 是同一个对象
}
private static void demo3() throws InstantiationException, IllegalAccessException {
//
Object obj = new Apple();
Class<?> clazz = obj.getClass();
//执行完上面两步后,就可以获得一个Class对象
//使用这个Class对象就可以创建Apple对象了
Fruit fruit = (Fruit) clazz.newInstance();
fruit.squeeze();
}
private static void demo2() throws InstantiationException, IllegalAccessException {
Class<?> clazz = Apple.class;
Fruit fruit = (Fruit) clazz.newInstance();
fruit.squeeze();
}
private static void demo1() throws FileNotFoundException, ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {
BufferedReader br = new BufferedReader(new FileReader("config.txt"));
// 获取到一个Class对象
Class clazz = Class.forName(br.readLine());
// 通过Class对象创建该类的一个实例
Fruit fruit = (Fruit) clazz.newInstance();
// 调用该对象的方法
fruit.squeeze();
}
}
作者:
颜小飞
时间:
2011-11-26 11:24
反射就是把java语言中的的类的各种组成部分映射到一个Class类型的类中。然后通过这个Class类型的类来得到java类的各种组成信息。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2