java框架基础之反射

来源:互联网 发布:mysql如何设置外键 编辑:程序博客网 时间:2024/06/07 01:23


反射


其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class  其实返回的是一个类A的Class对象,贴一个小代码演示一下:

public class Test {  /**   * @param args   */  public static void main(String[] args) {    // TODO Auto-generated method stub    // 得到类名(不包含包名)    System.out.println(String.class.getSimpleName());// String    // 得到类的全名称(包含所在的包名)    System.out.println(String.class.getName());// java.lang.String    System.out.println(Test.class.getName());// Test  }}

获取Calss对象的方式

主要有三种:

第一种:通过Class.forName(“类的全名称”)获取,用这个方法,最常见的应该是应用于JDBC注册驱动的时候用到的

try {    Class.forName("mysql.jdbc.driver.classDriver");// 注册驱动} catch (ClassNotFoundException e) {    // TODO Auto-generated catch block    e.printStackTrace();}

第二种:通过已经实例化的对象获取,getClass()方法获取

第三种:通过类名.class获取

public class Test {  /**   * @param args   */  public static void main(String[] args) {    // TODO Auto-generated method stub    Test test = new Test();    System.out.println(test.getClass());// class Test    System.out.println(Test.class);// class Test  }}

就我本人的理解:
我们自己定义的所有的类,都是Class类中的一个对象,我们自己定义的类,其他类,都有着一些属性,构造器等,根据这些相同的东西,我们是否就可以把我们定义的类抽象为Class类中的对象呢?答案是是的。

再说几个我们刚开始学习反射容易误解的例子
比如:
public class Test {  /**   * @param args   */  public static void main(String[] args) {    // TODO Auto-generated method stub    Test test = new Test();    System.out.println(test.getClass());// class Test    System.out.println(Test.class);// class Test  }}
在这个例子中,Test.class 其实是一个对象,是谁的对象呢?答案是 Class的对象,我们称之为类对象

 Class类的作用//实例化某个对象

 Class主要是反射的源头,不仅可以取得对象所在类的信息,也可以直接通过Class类的方法进行对象的实例化操作。

正常情况下我们通过关键字new进行对象实例化,如果现在已经实例化好的Class对象,则可以通过Class类中提供的方法

public   T    newInstance()

来实例化某个对象。

 

注意:在Person中必须存在一个无参数的构造方法。

Class<?>  class = Class.forName(com.test.demo.Person);

Person   person = (Person)class.newInstance();

 上面的操作等价于:

Person   person = new  Person();


反射的一些方法介绍
package reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class Main {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {// TODO Auto-generated method stubClass<?> clazz= Class.forName("reflect.people");System.out.println(clazz);people p=new people();System.out.println(p.getClass());System.out.println(people.class);System.out.println("--------------------");Method[] method=clazz.getMethods();for (Method method2 : method) {System.out.println(method2);}System.out.println("--------------------");System.out.println("--------------------");Method[] method3=clazz.getDeclaredMethods();for (Method method2 : method3) {System.out.println(method2);}System.out.println("--------------------");System.out.println("--------------------"); Method method4=clazz.getDeclaredMethod("getName",new Class[]{}); System.out.println(method4); method4=clazz.getDeclaredMethod("setName", new Class[]{String.class}); System.out.println(method4);  System.out.println("--------------------");System.out.println("--------------------");System.out.println();Constructor<?> con=clazz.getConstructor(new Class[]{});System.out.println(con);Constructor<?> con2=clazz.getConstructor(new Class[]{String.class,int.class});System.out.println(con2);}}

运行结果
class reflect.peopleclass reflect.peopleclass reflect.people--------------------public java.lang.String reflect.people.getName()public void reflect.people.setName(java.lang.String)public void reflect.people.setSmall(int)public int reflect.people.getSmall()public final native void java.lang.Object.wait(long) throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait() throws java.lang.InterruptedExceptionpublic final void java.lang.Object.wait(long,int) throws java.lang.InterruptedExceptionpublic boolean java.lang.Object.equals(java.lang.Object)public native int java.lang.Object.hashCode()public java.lang.String java.lang.Object.toString()public final native java.lang.Class java.lang.Object.getClass()public final native void java.lang.Object.notify()public final native void java.lang.Object.notifyAll()----------------------------------------public java.lang.String reflect.people.getName()public void reflect.people.setName(java.lang.String)public void reflect.people.setSmall(int)public int reflect.people.getSmall()----------------------------------------public java.lang.String reflect.people.getName()public void reflect.people.setName(java.lang.String)----------------------------------------public reflect.people(java.lang.String,int)

或许还是有很多同学不理解.class,,,怎么说呢。我们可以这样理解
JVM下的Class类中(Class[] 数组成员也是以.class 结尾),下的对象都是以 类名加.class结尾。
当我们在使用Class的时候,或者使用数组的时候所传递的参数都要以.class结尾(例如 String.class,int.class,等等)

Class类的实例对象
我们举例说明:
比如有一个 People类,people是People的一个实例对象
Class clazz =class.forName("全类名");
clazz是Class的实例对象 

Class clazz=People.class;
clazz 和 People.class都是实例对象,他们是等价的
从上面也可以看出每一个类中都是有着一个静态成员变量 class

Class clazz=people.getClass();
也能够得到Class的实例对象
PS(官网上说,clazz是People的类类型(class type))
其实就是就是Class类的实例对象的意思,类类型是为了区分People中的people等实例对象。


原创粉丝点击