java中的反射(学习框架的基础)(一)

学习好反射是我们要进一步学习框架的重要基础。

在这里我们要学习到如何获取一个类的反射,如何反射到一个类的字段、成员方法、构造方法.

下面要用到的一些代码:


package cn.liao;
public class Animal {
	public String name="aaa";
	private int weight=123;
	public static  int size=12;
	public Animal(){
		System.out.println("Animal");
	}
	
	public Animal(String name){
		System.out.println(name);
	}
	
	public Animal(String name,int weight){
		System.out.println(name+","+weight);
	}
	
	private Animal(List list){
		System.out.println(list);
	}
	
	public void f1(){
		System.out.println("f1 null");
	}
	
	public void f1(String name){
		System.out.println(name);
	}
	
	public void f1(String name,char[] passwd){
		System.out.println(name+":"+passwd);
	}
	
	private int[] f1(int[]passwd){
		return passwd;
	}
	
	public static void f1(int passwd){
		System.out.println(passwd);
	}
	
	public static void main(String[]args){
		System.out.println("main");
	}
}

反射类的关键字是  Class 注意区别于小写的class

1.获取到一个类的反射(有三种方式)

以上面代码中的类为例:

a.第一种方式

Class clazz=Class.forName("cn.liao.Animal");//一般使用这种传统的方式

在这里有一些需要我们注意的地方:forName()方法中要接收的参数是我们要反射的类所在包的完整路径,我们需要加上这个类所在的包的包名。

b.第二种方式

Class clazz=new Animal().getClass();

c.第三种方式

Class clazz=Animal.class;


2.反射一个类的构造方法

a. 获取Animal类的一个无参的构造函数,并利用获得的构造器new 一个对象


Constructor c=clazz.getConstructor(null);//注意当没有参数时,写null,不能为空
Animal an=(Animal) c.newInstance(null);//因为构造函数无参,所以写null;因为newInstance()方法返回的是一个Object对象,所以需要强转
System.out.println(an.name);


b.在这里获取的是一个带有String类型参数的构造函数


Constructor c=clazz.getConstructor(String.class);//接收String类型的参数

Animal an=(Animal) c.newInstance("xxx");//给接收String类型的构造函数传递一个具体的String类型的值
System.out.println(an.name);


c.注意:当接收一个int基本类型参数时,也是写 基本类型名称.class


Constructor c=clazz.getConstructor(String.class,int.class);//接收两个参数,一个为String,另一个为int型
Animal an=(Animal) c.newInstance("xxx",12);
System.out.println(an.name);


d.注意:getConstructor()和getDeclaredConstructor()的区别:

//getConstructor()只能获取被public修饰的构造函数

//getDeclaredConstructor()可以获取任何权限的构造函数


Constructor c=clazz.getDeclaredConstructor(List.class);
//我们知道当构造函数为private时,那么就不能用这个构造函数new对象,但是在反射中却可以访问
//被private修饰的构造函数
c.setAccessible(true);//暴力反射,就可以使得private方法可以被允许访问,这也是面试当中会遇到的。
Animal an=(Animal) c.newInstance(new ArrayList());
System.out.println(an.name);


e.补充

//这段代码相当于上面的先取得空构造函数的构建器,然后再new对象

Animal an=(Animal) clazz.newInstance();
System.out.println(an.name);



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值