Java反射(1)

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.A
com.test.A
class com.test.A
class 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;
	}

	@Override
	public void sayTest() {
		// TODO Auto-generated method stub
		System.out.println("名字 : " + this.uname + " 密码: " + this.upass);
	}

	@Override
	public String test(String sex, String tel) {
		return "性别 : "  +  sex + " 电话: " + tel ;
	}
	
}


结果:

class com.test.TestUserImpl 类全部实现的接口   : interface com.test.ITestUser
class com.test.TestUserImpl   类所继承的父类    :  class java.lang.Object
-----------------------------------------------------------
class com.test.TestUserImpl 构造方法   :public com.test.TestUserImpl()
class com.test.TestUserImpl 构造方法修饰符  :1
class com.test.TestUserImpl 方法名   :com.test.TestUserImpl
-----------------------------------------------------------
class com.test.TestUserImpl 构造方法   :public com.test.TestUserImpl(java.lang.String,java.lang.String)
class com.test.TestUserImpl 构造方法修饰符  :1
class com.test.TestUserImpl 方法名   :com.test.TestUserImpl
class com.test.TestUserImpl 参数类型   :java.lang.String
class com.test.TestUserImpl 参数类型   :java.lang.String
-----------------------------------------------------------
class com.test.TestUserImpl 构造方法   :public com.test.TestUserImpl(java.lang.String)
class com.test.TestUserImpl 构造方法修饰符  :1
class com.test.TestUserImpl 方法名   :com.test.TestUserImpl
class 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
 
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值