您的位置:首页 > 编程语言 > Java开发

java学习之路----反射基础

2013-11-26 23:09 645 查看
 1.认识Class类
               在正常的情况下,要一个完整的类才可以长生实例化对象,但是在JAVA中也可以通过一个对象来找到一个类的完整信息。     
2.下面来举一个例子
          package test;
[align=left]
[/align]
[align=left]class X{[/align]
[align=left]     [/align]
[align=left]}[/align]
[align=left]
[/align]
public class GetClassDemo
{
     public static void main(String[]
args) {
[align=left]          X x= new X();[/align]
[align=left]          [/align]
[align=left]          System. out.println(x.getClass().getName());[/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]test.X[/align]
[align=left]
[/align]
[align=left]3.所有的实例对象其实都是Class类的实例[/align]
[align=left]
[/align]
[align=left]我们来看看getClass()方法的定义都知道了[/align]
            public final native Class<?>
getClass();
[align=left]
[/align]
[align=left]这里返回的是一个Class类,所以所有类的实例化对象都是Class类的实例[/align]
[align=left]
[/align]
[align=left]4.Class 类的常用方法[/align]
[align=left]
[/align]
               


[align=left]
[/align]
[align=left]
[/align]
[align=left]4.实例化Class对象[/align]
[align=left]
[/align]
[align=left]          package test;[/align]
[align=left]
[/align]
[align=left]class W{[/align]
[align=left]     [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]public class ClassDemo1 {[/align]
     public static void main(String[]
args) throws Exception{
[align=left]          W w= new W();[/align]
[align=left]          Class<?> c1= null;[/align]
[align=left]          Class<?> c2= null;[/align]
[align=left]          Class<?> c3= null;[/align]
[align=left]          [/align]
[align=left]          c1=Class. forName(w.getClass().getName());//通过forName实例化(包.类)[/align]
[align=left]          [/align]
[align=left]          c2= new W().getClass();//通过Object的方法实例化[/align]
[align=left]          [/align]
[align=left]          c3=W. class;//通过类.class来实例化[/align]
[align=left]          [/align]
[align=left]          System. out.println(c1.getName());[/align]
[align=left]          System. out.println(c2.getName());[/align]
[align=left]          System. out.println(c3.getName());[/align]
[align=left]          [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]

[align=left]test.W[/align]
[align=left]test.W[/align]
[align=left]test.W[/align]
[align=left]
[/align]
[align=left]一般用包.类来实例化是比较常用的[/align]
[align=left]
[/align]
[align=left]5.   通过无参构造来实例化对象[/align]
[align=left]class Per{[/align]
[align=left]      private String name;[/align]
[align=left]     [/align]
[align=left]      private int age ;[/align]
      public String
getName() {
[align=left]           return name ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setName(String
name) {
           this .name =
name;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]
[/align]
      public int getAge()
{
[align=left]           return age ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setAge(int age)
{
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]
[/align]
      public Per()
{
[align=left]     }[/align]
[align=left]
[/align]
      public Per(String
name, int age) {
           this .name =
name;
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]      @Override[/align]
      public String
toString() {
[align=left]          [/align]
[align=left]           return "名字" + this. name+ "年龄"+ this .age ;[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left]
[/align]
public class ClassDemo2
{
      public static void main(String[]
args) {
[align=left]          Class<?> c= null ;[/align]
[align=left]          [/align]
[align=left]           try {[/align]
[align=left]              c=Class. forName( "test.Per");[/align]
          } catch (ClassNotFoundException
e) {
               // TODO Auto-generated
catch block
[align=left]              e.printStackTrace();[/align]
[align=left]          }[/align]
[align=left]          [/align]
[align=left]     Per per= null ;[/align]
[align=left]     [/align]
[align=left]      try {[/align]
[align=left]          per=(Per)c.newInstance(); //实例化对象[/align]
     } catch (InstantiationException
e) {
           // TODO Auto-generated
catch block
[align=left]          e.printStackTrace();[/align]
     } catch (IllegalAccessException
e) {
           // TODO Auto-generated
catch block
[align=left]          e.printStackTrace();[/align]
[align=left]     }[/align]
[align=left]     [/align]
[align=left]     per.setAge(30);[/align]
[align=left]     per.setName( "like" );[/align]
[align=left]     [/align]
[align=left]     System. out.println(per);[/align]
[align=left]     [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]结果:[/align]
[align=left]名字like年龄30 [/align]

[align=left]
[/align]
[align=left]如果是这种方式来实例化对象,你的类中没有无参构造就会报错[/align]
[align=left]
[/align]

java.lang.InstantiationException : test.Per

所以用这种方法的时候,一定要有无参的构造方法

所以在开发类的时候,最好留一个无参构造

6.有参构造来实例化对象

          一般步骤如下:

                    首先通过Class 类中的getConstructors这个方法来获取本类中的全部方法

                    再:向构造方法中传递一个对象数组进去,里面包含了构造方法所需要的参数

                    最后:通过Constructor实例化对象

     


[align=left]class Per{[/align]
[align=left]      private String name;[/align]
[align=left]     [/align]
[align=left]      private int age ;[/align]
      public String
getName() {
[align=left]           return name ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setName(String
name) {
           this .name =
name;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]
[/align]
      public int getAge()
{
[align=left]           return age ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setAge(int age)
{
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
      public Per(String
name, int age) {
           this .name =
name;
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
[align=left]      @Override[/align]
      public String
toString() {
[align=left]          [/align]
[align=left]           return "名字" + this. name+ "年龄"+ this .age ;[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left]
[/align]
public class ClassDemo3
{
      public static void main(String[]
args) {
[align=left]          Class<?> c= null ;[/align]
[align=left]          [/align]
[align=left]           try {[/align]
[align=left]              c=Class. forName( "test.Per");[/align]
          } catch (ClassNotFoundException
e) {
               // TODO Auto-generated
catch block
[align=left]              e.printStackTrace();[/align]
[align=left]          }[/align]
[align=left]          [/align]
[align=left]     Per per= null ;[/align]
[align=left]     [/align]
[align=left]     Constructor<?> cons []= null ;[/align]
[align=left]     cons=c.getConstructors();[/align]
[align=left]     [/align]
[align=left]      try {[/align]
[align=left]          per=(Per)cons[0].newInstance( "like" ,30);[/align]
     } catch (InstantiationException
e) {
           // TODO Auto-generated
catch block
[align=left]          e.printStackTrace();[/align]
     } catch (IllegalAccessException
e) {
           // TODO Auto-generated
catch block
[align=left]          e.printStackTrace();[/align]
     } catch (IllegalArgumentException
e) {
           // TODO Auto-generated
catch block
[align=left]          e.printStackTrace();[/align]
     } catch (InvocationTargetException
e) {
           // TODO Auto-generated
catch block
[align=left]          e.printStackTrace();[/align]
[align=left]     }[/align]
[align=left]     [/align]
[align=left]     [/align]
[align=left]     System. out.println(per);[/align]
[align=left]     [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]名字like年龄30[/align]
[align=left]以上代码比较复杂,所以最好留一个无参构造[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]7.反射的应用。获取类的结构[/align]
[align=left]
[/align]
[align=left]      7.1  取得一个类的全部接口[/align]
[align=left]
[/align]

[align=left]package fstest;[/align]
[align=left]
[/align]
[align=left]interface China{[/align]
      public static final  
String NATIONAL= "china" ;
      public static final  
String AUTHOR= "like" ;
[align=left]      public void sayChina();[/align]
      public String
sayhello(String name, int age);
[align=left]     [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]public class Person implements China{[/align]
[align=left]
[/align]
[align=left]      private String name;[/align]
[align=left]      private int age ;[/align]
[align=left]     [/align]
[align=left]     [/align]
      public String
getName() {
[align=left]           return name ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setName(String
name) {
           this .name =
name;
[align=left]     }[/align]
[align=left]
[/align]
      public int getAge()
{
[align=left]           return age ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setAge(int age)
{
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
      public Person()
{ //无参构造,好反射
[align=left]     }[/align]
[align=left]
[/align]
      public void sayChina()
{
[align=left]     [/align]
[align=left]          System. out .println("作者" + AUTHOR+ "国籍"+ NATIONAL );[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public String
sayhello(String name, int age) {
[align=left]     [/align]
[align=left]           return name+",你好,我今年" +age+"岁了" ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]

[align=left]package test;[/align]
[align=left]
[/align]
[align=left]public class GetInterfaceDemo {[/align]
      public static void main(String[]
args) throws Exception{
[align=left]          Class<?>c= null ;[/align]
[align=left]          [/align]
[align=left]          c=Class. forName( "fstest.Person");[/align]
[align=left]          [/align]
[align=left]          Class<?> []c1=c.getInterfaces(); //获得所有的接口[/align]
[align=left]          [/align]
[align=left]           for (int i=0;i<c1. length;i++){[/align]
[align=left]              System. out .println("实现接口的名字" +c1[i].getName());[/align]
[align=left]          }[/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]实现接口的名字fstest.China[/align]
[align=left]
[/align]
[align=left]接口也是一种特殊的类[/align]
[align=left]7.2取得类的父类[/align]
[align=left]
[/align]

[align=left]package test;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
      public static void main(String[]
args) throws Exception{
[align=left]          Class<?>c= null ;[/align]
[align=left]          [/align]
[align=left]          c=Class. forName( "fstest.Person");[/align]
[align=left]          [/align]
[align=left]          Class<?> c1=c.getSuperclass();[/align]
[align=left]          System. out .println("父类是" +c1);[/align]
[align=left]          [/align]
[align=left]          [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]父类是class java.lang.Object[/align]
[align=left]
[/align]
[align=left]这就验证了一个类如果不写出继承什么类,那么它默认继承Object类[/align]
[align=left]
[/align]
[align=left]7.3取得全部的构造方法[/align]
[align=left]
[/align]
[align=left]     package test;[/align]
[align=left]
[/align]
[align=left]import java.lang.reflect.Constructor;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
      public static void main(String[]
args) throws Exception{
[align=left]          Class<?>c= null ;[/align]
[align=left]          [/align]
[align=left]          c=Class. forName( "fstest.Person");[/align]
[align=left]          [/align]
[align=left]          Constructor<?> c1[]=c.getConstructors();[/align]
[align=left]           for (int i=0;i<c1. length;i++){[/align]
[align=left]              System. out .println("构造方法" +c1[i]);[/align]
[align=left]          }[/align]
[align=left]          [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]我在上面的那个person类中加了全参的构造方法[/align]

[align=left]package fstest;[/align]
[align=left]
[/align]
[align=left]interface China{[/align]
      public static final  
String NATIONAL= "china" ;
      public static final  
String AUTHOR= "like" ;
[align=left]      public void sayChina();[/align]
      public String
sayhello(String name, int age);
[align=left]     [/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]public class Person implements China{[/align]
[align=left]
[/align]
[align=left]      private String name;[/align]
[align=left]      private int age ;[/align]
[align=left]     [/align]
[align=left]     [/align]
      public String
getName() {
[align=left]           return name ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setName(String
name) {
           this .name =
name;
[align=left]     }[/align]
[align=left]
[/align]
      public int getAge()
{
[align=left]           return age ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public void setAge(int age)
{
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
      public Person()
{ //无参构造,好反射
[align=left]     }[/align]
[align=left]    [/align]
      public Person(String
name, int age) {
           this .name =
name;
           this .age =
age;
[align=left]     }[/align]
[align=left]
[/align]
      public void sayChina()
{
[align=left]     [/align]
[align=left]          System. out .println("作者" + AUTHOR+ "国籍"+ NATIONAL );[/align]
[align=left]     }[/align]
[align=left]
[/align]
      public String
sayhello(String name, int age) {
[align=left]     [/align]
[align=left]           return name+",你好,我今年" +age+"岁了" ;[/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]

[align=left]结果:[/align]

[align=left]构造方法public fstest.Person(java.lang.String,int)[/align]
[align=left]构造方法public fstest.Person()[/align]
[align=left]
[/align]
[align=left]7.4取得全部的方法[/align]
[align=left]
[/align]



[align=left]
[/align]
[align=left]取得一个类的全部方法定义[/align]
[align=left]          package test;[/align]
[align=left]
[/align]
[align=left]import java.lang.reflect.Method;[/align]
[align=left]import java.lang.reflect.Modifier;[/align]
[align=left]
[/align]
public class GetInterfaceDemo
{
      public static void main(String[]
args) throws Exception{
[align=left]          Class<?>c= null ;[/align]
[align=left]          [/align]
[align=left]          c=Class. forName( "fstest.Person");[/align]
[align=left]          [/align]
[align=left]          Method m[]=c.getMethods(); //取得全部方法[/align]
[align=left]          [/align]
[align=left]           for (int i=0;i<m. length;i++){[/align]
[align=left]              Class<?> r=m[i].getReturnType(); //返回值类型[/align]
[align=left]              [/align]
[align=left]              Class<?>p[]=m[i].getParameterTypes(); //参数类型(多参数,所以多个类型,所以用数组)[/align]
[align=left]              [/align]
[align=left]              String name=m[i].getName(); //方法名称[/align]
[align=left]              [/align]
[align=left]               int xx=m[i].getModifiers();//方法修饰符[/align]
[align=left]              [/align]
              System. out .print(Modifier.toString(xx)+ "
"); //还原修饰符
              System. out .print(r.getName()+"
" );//返回值类型
              System. out .print(name+"
" );
[align=left]              System. out .print("(" );[/align]
[align=left]               for (int j=0;j<p. length;j++){[/align]
                   System. out .print(p[j].getName()+"
"+ "args"+j);
[align=left]                    if (j<p.length -1){[/align]
[align=left]                        System. out .print("," );[/align]
[align=left]                   }[/align]
[align=left]                   [/align]
[align=left]              }[/align]
[align=left]              Class<?>ex[]=m[i].getExceptionTypes(); //得到全部的异常[/align]
[align=left]               if (ex.length >0){[/align]
                   System. out .print(")
throws" );
[align=left]              } else {[/align]
[align=left]                   System. out .print(")" );[/align]
[align=left]              }[/align]
[align=left]               for (int x=0;x<ex. length;x++){[/align]
[align=left]                   System. out .print(ex[x].getName());[/align]
[align=left]                    if (x<ex.length -1){[/align]
[align=left]                        System. out .print("," );[/align]
[align=left]                   }[/align]
[align=left]              }[/align]
[align=left]              System. out .println();[/align]
[align=left]          }[/align]
[align=left]          [/align]
[align=left]          [/align]
[align=left]          [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]public java.lang.String sayhello (java.lang.String args0,int args1)[/align]
[align=left]public void sayChina ()[/align]
[align=left]public void setAge (int args0)[/align]
[align=left]public int getAge ()[/align]
[align=left]public java.lang.String getName ()[/align]
[align=left]public void setName (java.lang.String args0)[/align]
[align=left]public final native java.lang.Class getClass ()[/align]
[align=left]public native int hashCode ()[/align]
[align=left]public boolean equals (java.lang.Object args0)[/align]
[align=left]public java.lang.String toString ()[/align]
[align=left]public final native void notify ()[/align]
[align=left]public final native void notifyAll ()[/align]
[align=left]public final void wait (long args0,int args1) throwsjava.lang.InterruptedException[/align]
[align=left]public final void wait () throwsjava.lang.InterruptedException[/align]
[align=left]public final native void wait (long args0) throwsjava.lang.InterruptedException[/align]

[align=left]
[/align]
[align=left]是不是发现多了些方法,不是只有两个嘛,怎么这么多,这是因为默认继承Object类[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]比如在eclipse中,你输入一个"."就可以调用全部的方法,就是通过这种方法来的[/align]
[align=left]
[/align]
[align=left]7.5取得全部的属性[/align]
[align=left]
[/align]
[align=left]          这里属性又分为两个[/align]
[align=left]                    一个是父类属性或者接口属性:public Field[] getFields() throws ...[/align]
[align=left]                      另一个是本类的的属性  :public getDeclaredFields() throws...[/align]
[align=left]
[/align]



[align=left]
[/align]
[align=left]取得person类的全部属性[/align]
[align=left]
[/align]
               public class GetInterfaceDemo
{
      public static void main(String[]
args) throws Exception{
[align=left]          Class<?>c= null ;[/align]
[align=left]          [/align]
[align=left]          c=Class. forName( "fstest.Person");[/align]
[align=left]          [/align]
[align=left]          Field fields[]=c.getDeclaredFields();[/align]
[align=left]          [/align]
[align=left]           for (int i=0;i<fields. length;i++){[/align]
[align=left]              Class<?> r=fields[i].getType(); //取得属性的类型[/align]
[align=left]              [/align]
[align=left]               int mo=fields[i].getModifiers();//取得修饰符的数字[/align]
[align=left]              [/align]
[align=left]              String piv=Modifier. toString(mo); //取得修饰符[/align]
[align=left]              [/align]
[align=left]              System. out .print("本类属性:" );[/align]
              System. out .print(piv+"
" +r.getName()+ " "+fields[i].getName());
[align=left]              System. out .println();[/align]
[align=left]          }[/align]
[align=left]          System. out .println("------------------" );[/align]
[align=left]          {[/align]
[align=left]          Field e[]=c.getFields();[/align]
[align=left]           for (int i=0;i<e. length;i++){[/align]
[align=left]              Class<?> r1=e[i].getType();[/align]
[align=left]               int mo=e[i].getModifiers();[/align]
[align=left]              String piv=Modifier. toString(mo);[/align]
              System. out .print("父类属性" +piv+"
" + r1.getName()+" " +e[i].getName());
[align=left]              System. out .println();[/align]
[align=left]          }[/align]
[align=left]          [/align]
[align=left]          }[/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]本类属性:private java.lang.String name[/align]
[align=left]本类属性:private int age[/align]
[align=left]------------------[/align]
[align=left]父类属性public static final java.lang.String NATIONAL[/align]
[align=left]父类属性public static final java.lang.String AUTHOR[/align]
[align=left]
[/align]
[align=left]
[/align]

[align=left]
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: