1. 先认识两个类
Object:超类,所有的类全是继承于他
Class类:同样继承于Object类,该类主要存储各个类的原信息。
2. 反射作用
简单来说,就是在只知道该类的类名的情况下,可以用该类 实例化一个对象,并且操作该类的各种方法和数据。
3.反射的简单方法
3.1先定义一个Group类
package baobao;
public class Group {
public String username;
public int age;
public String setusername(String username)
{
return this.username = username;
}
public String getusername()
{
return this.username;
}
public int setage(int age)
{
return this.age = age;
}
public int getage()
{
return this.age;
}
}
3.2定义一个测试类,里面写测试方法
3.2.1 生成Class对象的几个方法
<pre name="code" class="java"><pre name="code" class="java"> @Test
public void test()
{
Group group = new Group();
Class<?> demo = null;
//直接输出实例化对象
System.out.println(group);
//方法1:类.class,生成一个Class类的对象,存储Group类的各种元信息
System.out.println("类.class :"+Group.class);
//方法2:对象.getClass,生成一个Class类的对象,存储Group类的各种元信息
System.out.println("对象.getClass() :"+group.getClass());
//方法3:Class.forName("类的url").生成一个Class类的对象,存储Group类的各种元信息
try {
demo = Class.forName("baobao.Group");
System.out.println("Class.forName(\"类的url\") :"+group.getClass());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
输出的结果:
baobao.Group@ad021c3
类.class : class baobao.Group
对象.getClass() : class baobao.Group
Class.forName("类的url") :class baobao.Group
3.2.2Class对象可以干什么,简单说一下,该段代码不能跑
Class<?> demo = null;
Object object1 = null;
Object object2 = null;
Object object3 = null;
try {
// 先创建一个关于baobao.Group的Class对象
demo = Class.forName("baobao.Group");
// 创建了Class对象后可以干什么呢?简单说下
// 1.获取属性(权限、类型、名称)
demo.getFields(); // 获取所有属性
demo.getFields()[0].getType();// 获取第一个属性的类型,这是一个Class对象哦
demo.getField("");// 获取指定属性
demo.getField("").getType();// 获取指性的类型,也是一个Class对象
// 2.获取所有构造函数
Constructor[] xuni = demo.getConstructors();
// 3.带参构造函数实例化对象
object1 = xuni[0].newInstance();
object2 = xuni[1].newInstance(10, 10, 10, 10);
// 4.无参构造实例化对象
object3 = demo.newInstance();
// 5.使用实例对象的方法
Class[] str = { demo.getField("").getType(),demo.getField("").getType() };
Method method =demo.getMethod("方法名", str);// getMethod("方法名",{String.class,int.class,各种类型的Class对象});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.2.3 示例:使用反射方法给username赋值并取出值
简单代码如下
@Test
public void testfanshe() {
Class<?> demo = null;
Object object = null;
try {
demo = Class.forName("baobao.Group");
object = demo.newInstance();
System.out.println(String.class);
System.out.println(object.getClass().getField("username").getType());
Class<?>[] str = { object.getClass().getField("username").getType() };
Method method = demo.getMethod("setusername", str);
method.invoke(object, "姓名");
method = demo.getMethod("getusername");
System.out.println(method.invoke(object));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
运行结果:
class java.lang.String
class java.lang.String
姓名
建议看看这篇文章,让你对反射有更新的认识。
以下是转载的内容
一、Java的反射机制
在这里可以看出;接口的两重性:可以把接口当做类(因为在接口中有静态变量时,他可以被初始化);接口就是接口,和类无关(接口中 没有构造方法,所以不能被初始化)
public class A
{
}
结果:class demo.A
.......................................
2)Class
3)Class.forName("类名");
从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用Class对象的newInstance()方法的时候,就必须保证:1、这个
现在可以看出,Class对象的newInstance()(这种用法和Java中的工厂模式有着异曲同工之妙)实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。
最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance:
new: