Class类简介和spring内部对Class类的使用

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使用注解时可完成注入的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值