Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。了解Class类对掌握java 运行时类型信息至关重要。
获得class对象的三种方法
1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如:
MyObject x;
Class c1 = x.getClass();
2、使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如:
Class c2=Class.forName(“MyObject”),Employee必须是接口或者类的名字。
3、获取Class类型对象的第三个方法非常简单。如果T是一个Java类型,那么T.class就代表了匹配的类对象。例如
Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;
Class.forName介绍
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段
jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了,而且以后不会再执行这段静态代码了。
public class Candy {
Candy(){
System.out.println("Constructor output Candy");
}
static int gumint=100;
static{
System.out.println("loading Candy");
}
public void print(){
System.out.println("print Candy");
}
public String toString(){
return "Candy Candy toString";
}
}
现在我们来测试一下
public static void main(String[] args) {
System.out.println("start text");
Class a=Class.forName("test.Candy");
System.out.println("test Instance");
Candy candy=(Candy)a.newInstance();//必须类型转化才可以调用 obja就无法调用print方法
candy.print();
//省略了try catch
输出的结果
start text
loading Candy
test Instance
Constructor output Candy
print Candy
从结果我们可以看出来,使用Class.forName()加载一个类时,执行了这个类的静态代码块,但是不会调用这个类的构造方法,只有在newInstance()的时候才会调用他的构造方法。如果直接调用Candy中的static变量时,也会加载这个类,并执行这个类的静态代码块。另外,我们可以发现,Candy candy =(Candy)Class.forName(test.Candy),newInstance()就相当于Candy candy=new Candy()
类字面变量.class**重点内容**
对于上面的实例,使用类字面变量例如:Class a=Candy.class
类字面变量.class 不同与forname的是,不会在获得class对象的时候,不会进行初始化,所以不会调用static代码块
spring中使用Class实例化
bean.xml
<bean id="id" class="com.xy.Student" />
Spring将采用的代码创建代码Java实例
Class c = Class.forName("com.xy.Student");
Object bean = c.newInstance();
4 Class类调用方法
package cn.classes;
public class Person
{
public void add()
{
System.out.println("add");
}
public void addWithParameters(String name, int age)
{
System.out.println("add带参数方法" + name + age);
}
}
package cn.test;
import java.lang.reflect.Method;
public class Test
{
public static void main(String[] args)
{
Class<?> c1 = null;
try
{
c1 = Class.forName("cn.classes.Person");
// 不带参数的方法调用
Method m = c1.getMethod("add");
m.invoke(c1.newInstance());
// 带参数方法调用
Method m1 = c1.getMethod("addWithParameters", String.class, int.class);
m1.invoke(c1.newInstance(), "xy", 22);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
5 Class获得getter setter方法
Class这个类可以获得类的很多信息,比如获得该类的接口,构造函数,属性,方法等。如何获得getter,setter方法。
package cn.classes;
public class Person
{
private String name;
private int age;
// 省略getter setter
}
package cn.test;
import java.lang.reflect.Method;
public class Test
{
public static void main(String[] args)
{
Class<?> c1 = null;
Object obj = null;
try
{
c1 = Class.forName("cn.classes.Person");
obj = c1.newInstance();
setter(obj, "name", "xy", String.class);
setter(obj, "age", 20, int.class);
getter(obj, "name");
getter(obj, "age");
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* @param obj:要操作的对象
* @param att:要操作的属性
* @param value:要设置的属性内容
* @param type:要设置的属性类型
*/
public static void setter(Object obj, String att, Object value, Class<?> type)
{
try
{
// 得到setter方法
Method m = obj.getClass().getMethod("set" + initStr(att), type);
m.invoke(obj, value);
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* @param obj:要操作的对象
* @param att:要操作的属性
*/
public static void getter(Object obj, String att)
{
try
{
// 得到getter方法
Method m = obj.getClass().getMethod("get" + initStr(att));
System.out.println(m.invoke(obj));
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static String initStr(String oldStr)
{
String newStr = oldStr.substring(0, 1).toUpperCase() + oldStr.substring(1);
return newStr;
}
}
6 Spring调用getter setter方法
以setter注入例子
bean.xml
<bean id="id" class="com.xy.Student">
<property name="stuName" value="xy" />
</bean>
Spring将采用的代码创建代码Java实例,并注入值:
Class c = Class.forName("com.xy.Student");
Object bean = c.newInstance();
通过一些操作获取对stuName对应的setter方法名
String setname = "set" + "StuName";
Method method = c.getMehod(setname,String.Class);
method.invoke(bean,"xy");
这样就完成了最基本的注入操作。当然Spring还可以通过构造函数进行注入。这样就参考第二点有参构造的Class的使用。
Class还可以访问Annotation,这样就Spring使用注解时可完成注入的功能。