Class类简介和spring内部对Class类的使用
2017-07-01 16:41
405 查看
Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。了解Class类对掌握java 运行时类型信息至关重要。
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;
jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了,而且以后不会再执行这段静态代码了。
现在我们来测试一下
从结果我们可以看出来,使用Class.forName()加载一个类时,执行了这个类的静态代码块,但是不会调用这个类的构造方法,只有在newInstance()的时候才会调用他的构造方法。如果直接调用Candy中的static变量时,也会加载这个类,并执行这个类的静态代码块。另外,我们可以发现,Candy candy =(Candy)Class.forName(test.Candy),newInstance()就相当于Candy candy=new Candy()
类字面变量.class 不同与forname的是,不会在获得class对象的时候,不会进行初始化,所以不会调用static代码块
spring中使用Class实例化
Spring将采用的代码创建代码Java实例
4 Class类调用方法
5 Class获得getter setter方法
Class这个类可以获得类的很多信息,比如获得该类的接口,构造函数,属性,方法等。如何获得getter,setter方法。
Spring将采用的代码创建代码Java实例,并注入值:
通过一些操作获取对stuName对应的setter方法名
这样就完成了最基本的注入操作。当然Spring还可以通过构造函数进行注入。这样就参考第二点有参构造的Class的使用。
Class还可以访问Annotation,这样就Spring使用注解时可完成注入的功能。
获得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=(Ca 4000 ndy)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使用注解时可完成注入的功能。
相关文章推荐
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- Simple-Spring-Memcached 使用简介
- Spring -jdbcTemlpate使用小简介
- Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)
- 使用 spring.profiles.active 及 @profile 注解 动态化配置内部及外部配置
- struts、spring国际化资源文件使用简介
- 来自BIT内部的SpringBoot Kafka 整合使用
- Spring Boot下的lombok安装以及使用简介
- Spring中的Quartz使用方法简介
- Spring Cloud Sleuth使用简介
- Spring Http Invoker使用简介
- Spring中使用内部Bean关联多个Bean,不能被外部Bean关联
- Spring Boot下的lombok安装以及使用简介
- SpringBoot内部配置:“application.properties配置”和”使用XML配置”,读取属性文件中的内容,日志配置,Profile配置(学习:SpringBoot实战)
- Spring Cloud Sleuth使用简介
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- Spring-jdbc:JdbcTemplate使用简介
- spring学习(九)—spring jdbcTemplate的使用简介
- RabbitMQ简介,安装,Spring集成 demo,以及使用(spring集成在最下面)
- 来自BIT内部的SpringBoot Kafka 整合使用