Java反射(1)

来源:互联网 发布:aimbooster for mac 编辑:程序博客网 时间:2024/06/05 01:52

Java反射

             1.实例化Class类对象的方法有三种:

                    ⑴. 通过forName()方法

                    ⑵. 类.class;

                    ⑶. 对象.getClass();

代码: 

 

package com.test;public class Test_Class {public static void main ( String [] args ) {A a = new A();   //实例化对象System.out.println(a.getClass());System.out.println(a.getClass().getName());System.out.println(A.class);try {System.out.println(Class.forName("com.test.A"));} catch (ClassNotFoundException e) {e.printStackTrace();}}}class A{}

结果:

    

class com.test.Acom.test.Aclass com.test.Aclass com.test.A


一旦实例化对象后可以更进一步的进行操作


例如:

    

package com.test;public class Test_Class {public static void main ( String [] args ) {try {A a = null ;  //声明对象Class<?> c = (Class) Class.forName("com.test.A"); // 得到                                                                  //A a = (A) Class.forName("com.test.A");因为返回的是一个Object类型 所以向下转型System.out.println(c.getClass().getName());  //输出类名a = (A)c.newInstance();  //实例化对象a.setAge(10);a.setName("test");System.out.println(a);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}}class A{private String name ;private int age ;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString(){return "姓名 : " + this.name + " 年龄: " + this.age ;}}

结果:

  

class com.test.A姓名 : test 年龄: 10

以上代码可以发现 如果不使用关键字new 也可以实例化一个对象并且必须包含一个无参构造方法 否则无法被实例化.

自己看了源码

 

    import java.lang.reflect.InvocationTargetException;     /** This interface provides the declaration for          java.lang.reflect.Constructor.invoke(). Each Constructor object is          configured with a (possibly dynamically-generated) class which          implements this interface. */ 
/** Matches specification in {@link java.lang.reflect.Constructor} */ 

 /**大概意思是说此接口提供java.lang.reflect.Constructor.invoke()声明每个构造对象可能动态生成的类,它实现了这个接口。并且符合
       *java.lang.reflect.Constructor规范
*/
       public interface ConstructorAccessor {                  public Object newInstance(Object[] args)              throws InstantiationException,                     IllegalArgumentException,                     InvocationTargetException;      }
如果必须使用有参构造函数的话可以.

1.通过Class类中getConstructors()方法取得本类中全部的构造函数.

2.想构造方法传递一个一个对象数组进去 里面包含了构造方法中所需的各个参数

3之后通过Constructor实例化对象

Constructor表示构造函数类

一般建议类中包含一个无参构造函数.

java.lang.reflect包中的常用类

1. Constructor 表示类中的构造函数

getModifiers(); 取得修饰符

getName(); 取得方法名

getParamenterTypes() 取得参数的类型

2. Field 表示类中的属性

3. Mehtod 表示类中的方法

这三个类都是 AccessibleObject类的子类

   

代码:
package com.test;import java.lang.reflect.Constructor;public class Test_Constructor {public static void main ( String [] args ) {try {//实例化对象Class<?> c = Class.forName("com.test.TestUserImpl");//取得类全部实现的接口Class [] c1 = c.getInterfaces();//取得类所继承的父类Class<?> c2 = c.getSuperclass();//取得类中的全部构造方法Constructor<?>[] con = c.getConstructors();for ( int i = 0 ; i < c1.length ; i++ ){System.out.println(c +  " 类全部实现的接口   : " + c1[i]);}System.out.println( c + "   类所继承的父类    :  " + c2);System.out.println("-----------------------------------------------------------");for( int i = 0 ; i < con.length ; i++ ){//得到构造方法中的参数类型Class<?>[] c4 = con[i].getParameterTypes();System.out.println( c + " 构造方法   :" + con[i]);System.out.println( c + " 构造方法修饰符  :" + con[i].getModifiers());System.out.println( c + " 方法名   :" + con[i].getName());for ( int j = 0 ; j < c4.length ; j++ ){System.out.println( c + " 参数类型   :" + c4[j].getName());}if ( i < con.length -1 ){System.out.println("-----------------------------------------------------------");}}} catch (ClassNotFoundException e) { e.printStackTrace();}}}interface ITestUser{public static final String uname = "rock";public static final int upass = 123;public void sayTest();public String test(String s1 , String s2 );}class TestUserImpl implements ITestUser{private String sex ;private String tel ;public TestUserImpl(){}public TestUserImpl( String sex ){this.sex = sex ;}public TestUserImpl( String sex , String tel ){this(sex) ;this.tel = tel ;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getTel() {return tel;}public void setTel(String tel) {this.tel = tel;}@Overridepublic void sayTest() {// TODO Auto-generated method stubSystem.out.println("名字 : " + this.uname + " 密码: " + this.upass);}@Overridepublic String test(String sex, String tel) {return "性别 : "  +  sex + " 电话: " + tel ;}}


结果:

class com.test.TestUserImpl 类全部实现的接口   : interface com.test.ITestUserclass com.test.TestUserImpl   类所继承的父类    :  class java.lang.Object-----------------------------------------------------------class com.test.TestUserImpl 构造方法   :public com.test.TestUserImpl()class com.test.TestUserImpl 构造方法修饰符  :1class com.test.TestUserImpl 方法名   :com.test.TestUserImpl-----------------------------------------------------------class com.test.TestUserImpl 构造方法   :public com.test.TestUserImpl(java.lang.String,java.lang.String)class com.test.TestUserImpl 构造方法修饰符  :1class com.test.TestUserImpl 方法名   :com.test.TestUserImplclass com.test.TestUserImpl 参数类型   :java.lang.Stringclass com.test.TestUserImpl 参数类型   :java.lang.String-----------------------------------------------------------class com.test.TestUserImpl 构造方法   :public com.test.TestUserImpl(java.lang.String)class com.test.TestUserImpl 构造方法修饰符  :1class com.test.TestUserImpl 方法名   :com.test.TestUserImplclass com.test.TestUserImpl 参数类型   :java.lang.String //看  class com.test.TestUserImpl 构造方法修饰符  :1  得到的却是一个数字 因为java修饰符在底层是用数字表示的//如果想把他换成我们看得懂的关键字 则必须使用Modifier类的toString(int mod);方法//  修改代码: 
                    int h = c4[j].getModifiers();                    System.out.println("转换后的权限 : " +  Modifier.toString(h));//结果为:   转换后的权限 : public final