Java反射

来源:互联网 发布:工程优化设计收费标准 编辑:程序博客网 时间:2024/06/06 05:32

本人菜鸟一枚,对于学到的东西总爱记录下来,这里贴出一些java反射相关的知识

首先是class对象,对于加载到内存中的任何一个类,虚拟机都会在加载类的同时,创建一个class对象与该类对应,这个class对象中保存了这个类的信息。

获取class对象:(Class类在java.lang包中,可以通过查看API了解其用法)

//第一步,获取class对象//Demo d=new Demo();//自定义的类//Class clazz=d.getClass();//第一种//Class clazz=Demo.class;//第二种//Class clazz=Class.forName("reflect.Demo");//第三种//System.out.println(clazz);
java.lang.reflect包下有三个反射相关的类Constructor(对应类的构造函数),Field(对应类中的属性),Method(对应类中的方法),通过这三个类可以得到类的属性和方法等信息。下面介绍如何使用它们

//获取类的构造函数//public Constructor<T> getConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException这个方法可以获得类的公共构造//函数//public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)throws NoSuchMethodException,SecurityException这个方法可以获取所有//构造函数,包括私有的//这里要说明的是Class<?>... parameterTypes是个可变参数,即参数的个数是可变的,这是jdk5的新特性//Constructor constructor1=clazz.getConstructor();//获取无参的构造函数//Constructor constructor2=clazz.getConstructor(int.class);//获取有参的构造函数//Constructor constructor3=clazz.getDeclaredConstructor(int.class,String.class);//获取私有的构造函数//Constructor[] constructors=clazz.getConstructors();//获取所有公共的构造函数//for(Constructor con:constructors){//System.out.println(con);//}//Constructor[] constructors1=clazz.getDeclaredConstructors();//获取所有的构造函数,包括私有的//for(Constructor con:constructors1){//System.out.println(con);//}
接下来就可以利用这些构造函数做一些事情了,比如创建一个类的实例

//Demo d=(Demo) constructor1.newInstance();//d.show();//Demo d1=(Demo)constructor2.newInstance(22);//System.out.println(d1.getAge());//constructor3.setAccessible(true);//constructor3是个私有构造函数,要先把它设置为true,取消java的语法检查//Demo d2=(Demo)constructor3.newInstance(22,"flying");//System.out.println(d2.getAge());//看看,通过反射机制,连私有的构造函数都可用了,然而反射的功能不只在这,它主要是可以动态获取类的信息,接触过框架的同学应该知道
//获取类的方法,和获取构造函数类似//Method m1=clazz.getMethod("show");//Method m2=clazz.getDeclaredMethod("show1", String.class);//Method[] m3=clazz.getMethods();//Method[] m4=clazz.getDeclaredMethods();//调用方法//Demo demo=new Demo();//m1.invoke(demo);//m2.setAccessible(true);//和构造函数一样//m2.invoke(demo, "helloworld");
////获取类的属性//Field f1=clazz.getField("name");//Field f2=clazz.getDeclaredField("age");//Field[] f3=clazz.getFields();//Field[] f4=clazz.getDeclaredFields();////为属性设置参数//f1.set(demo, "gaohui");//System.out.println(demo.name);//f2.setAccessible(true);//f2.set(demo, 22);//System.out.println(demo.getAge());
最后贴出我Demo类的代码
package reflect;public class Demo {private int age;public String name;public Demo(){System.out.println("默认构造函数");}public Demo(int age){this.age=age;}private Demo(int age,String name){this.age=age;this.name=name;}public int getAge(){return age;}public void setName(String name){this.name=name;}public void show(){System.out.println("这里是测试方法");}private void show1(String message){System.out.println(message);}}

第一次写,写的不好,哈哈哈








0 0
原创粉丝点击