黑马程序员----------反射

------- android培训java培训、期待与您交流! ----------

获取某个类的Class对象的三种方式:
  
  方式一:调用对象的getClass()方法。它是Object类中的方法。
       此方法是普通方法,不是静态的,要通过类的对象的引用去调用。
       Student stu = new Studetn();
       Class stuClass = stu.getClass();
  方式二:任何的"数据类型"都有一个"静态的属性"--class属性,这个属性可以
       获取这个类的Class对象
  方式三:调用Class类中的静态方法forName()可以获取某个类的Class对象;(常用方式)
   public static Class forName(String className)


通过这个Class对象,我们可以:
  
  1.获取并调用这个类的所有的构造方法:
   批量获取
   1.public Constructor[] getConstructors():获取所有公共构造方法
   2.public Constructor[] getDeclaredConstructors():获取所有构造方法。包括公有,受保护,默认,私有
   获取单个的构造方法:
   1.public Constructor getConstructor(Class... parameterTypes):获取类中的指定的"公有构造方法"。
     参数:parameterTypes:构造方法形参的类型的Class
   2.public Constructor getDeclaredConstructor(Class...parameterTypes):获取类中的任何的构造方法,包括私有的

调用构造方法:通过Constructor去调用。使用方法:public T newInstance(Object... initargs)


通过Class对象获取成员属性,并调用:

 批量获取:
1.Field[] getFields() :所用"公有"的成员属性
2.Field[] getDeclaredFields()  :所有的成员属性,包括私有的:
 获取单个的属性
1.Field getField(String fieldName):获取单个的,公有的成员属性
2.Field getDeclaredField(String fieldName):获取单个的成员属性,可以是任何的访问级别


通过Class对象获取某个类的成员方法并调用:
  
  批量获取:
   1.Method[] getMethods() :获取所有的"公有"方法;
   2.Method[] getDeclaredMethods() :获取所有方法,包括私有的。
  获取单个的:
   1.Method getMethod(String name, Class<?>... parameterTypes) :获取某个公有的方法。
                形参:name:方法名;
                 parameterTypes:形参的类型列表;
                2.Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取某个方法。可以是私有的。


以下为案例代码:

首先创建一个被调用的类生成class文件:

public class Student {
	//********一些构造方法***********//
	//公有的
	public Student(){
		System.out.println("调用了公有的,无参的构造方法");
	}
	public Student(boolean b){
		System.out.println("调用了公有的,带参的构造方法。b = " + b);
	}
	//受保护的
	protected Student(int n){
		System.out.println("调用了受保护的构造方法 n = " + n);
	} 
	//默认的
	Student(String s){
		System.out.println("调用了默认的构造方法。s = " + s);
	}
	//私有的
	private Student(char c){
		System.out.println("调用了私有的构造方法。c = " + c);
	}
	
	//*****************成员属性***************//
	public String stuName;
	protected int age;
	char sex;
	private String address;
	//*****************成员方法*******************//
	
	public void show(){
		System.out.println("调用了公有,无参的show()方法");
	}
	protected void show(String s){
		System.out.println("调用了受保护的,带参的show()方法。参数s = " + s);
	}
	void show(int n){
		System.out.println("调用了默认的,带参的show()方法。参数n = " + n);
	}
	private int  show(char c){
		System.out.println("调用了私有的,带参的带返回值的show()方法。参数c = " + c);
		return 10 + 20;
	}
}
然后再main方法中实现:

public static void main(String[] args) throws Exception {
		
		//三种创建class类的方法
		Student stu=new Student();
		Class c1=stu.getClass();
		
		Class c2=Student.class;
		
		Class c3=null;
		try {
			c3=Class.forName("cn.wxw.反射.Student");
		} catch (ClassNotFoundException e) {
		}
		
		//获取class文件中的所有构造方法
		Constructor[] g1=c3.getDeclaredConstructors();
		for(Constructor c:g1){
			System.out.println(c);
		}
		System.out.println("------------------------");
		
		//获取所有的 公有 狗仔方法
		 Constructor[] g2=c3.getConstructors();
		 for(Constructor c:g2){
			 System.out.println(c);
		 }
		
		System.out.println("------------------------");
		
		//获取单个公共构造方法
		Constructor g3=c3.getConstructor();
		System.out.println(g3);
		g3=c3.getConstructor(boolean.class );
		System.out.println(g3);
		
		System.out.println("------------------------");
		
		//获取一个任类型构造方法
		Constructor g4=c3.getDeclaredConstructor(char.class);
		System.out.println(g4);
		
		
		System.out.println("------------------------");
		
		//以下是获取字段
		
		//获取所有字段
		Field[] f1=c3.getDeclaredFields();
		for(Field f:f1){
			System.out.println(f);
		}
		
		System.out.println("------------------------");
		
		//获取公有字段
		Field[] f2=c3.getFields();
		for(Field f:f2){
			System.out.println(f);
		}
		
		System.out.println("------------------------");
		
		//获取指定公有字段
		Field f3=c3.getField("stuName");
		System.out.println(f3);
		
		System.out.println("------------------------");
		
		//获取指定字段
		Field f4=c3.getDeclaredField("address");
		System.out.println(f4);
		
		//下面是获取成员方法  也分为4种
		System.out.println("*************************************获取所有\"公有\"的成员方法**********************************");
		Method[] methodArray = c3.getMethods();//包含了父类的方法
		for(Method m : methodArray){
			System.out.println(m);
		}
		System.out.println("*************************************获取所有的成员方法,包括私有的**********************************");
		Method[] methodArray2 = c3.getDeclaredMethods();//不包含父类的。
		for(Method m : methodArray2){
			System.out.println(m);
		}
		
		System.out.println("*************************************获取单个\"公有\"的\"无参\"的成员方法**********************************");
		Method m1 = c3.getMethod("show");
		System.out.println(m1);
		
		System.out.println("*************************************获取单个\"私有\"的\"带参\"的成员方法**********************************");
		Method m2 = c3.getDeclaredMethod("show", char.class);
		System.out.println(m2);
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值