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

Java反射学习总结一(基础篇)

2014-05-04 20:05 423 查看
Class类是Reflection API中核心的类,他位于java.lang.Class

列出一些常用的方法。

- getName() : 获得类的完整名字

- getFields() : 获得类的public类型的属性

- getDeclaredFields() : 获得类的所有属性

- getMethods() : 获得类的public类型的方法

- getDeclaredMethods() : 获得类的所有方法

- getMethod(String name, Class[] parameterTypes) : 获取类的特定方法(name参数指定方法名字,parameterTypes参数指定方法参数类型)

- getConstructors() : 获得类的public类型的构造方法

- getConstructor(Class[] parameterTypes) : 获得类的特定构造方法(parameterTypes参数指定构造方法的参数类型)

- newInstance() : 通过类的不带参数的构造方法创建这个类的一个对象

如果想使用反射,有2个关键的部分

1.获取Class对象

2.获得对象实例

下面来介绍这两个部分:

1.如何获取Class对象

获取某个类或某个对象所对应的Class对象的常用的3种方法

a) 使用Class类的静态方法forName:

Class.forName("java.lang.String");

b) 使用类的.class语法:

String.class;

c) 使用对象的getClass()方法(java.lang.Object类中的方法):

String s = "aa";

Class<?> clazz = s.getClass();

2.如何获得对象实例

大家都知道获得对象实例就是去new一个,其实就是调用对象的构造方法

这里将调用构造方法参数的不同分为两种类型:

a)调用无参数的构造方法:

1.调用Class对象的newInstance()方法:

Class<?> classType = ClassClass.forName("java.lang.String");

Object object = classTpye.newInstance();

2.调用Class对象的Constructor对象的newInstance()方法,传递一个空的Class对象数组作为参数:

Class<?> classType = ClassClass.forName("java.lang.String");

Constructor cons = classType.getConstructor(new Class[]{});

Object object =cons.newInstance(new Object[]{});

b)调用有参数的构造方法:

1.调用Class对象的Constructor对象的newInstance()方法,传递一个可变长的Class对象数组作为参数,本例传递String,int两个参数:

Class<?> classType = ClassClass.forName("java.lang.String");

Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});

Object object =
cons.newInstance(new Object[]{"hello",3});

下面来一个小Demo,由于过于简单这里就只贴代码了

这个demo简单的实现了上面介绍的一些关于反射的用法,算是一个复习巩固:

class Person {

	private long id;
	private int age;
	private String name;
	
	public Person() {
		
	}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() {
		
		return "Name="+getName()+"  Age="+getAge()+"  Id="+getId();
	}
	
	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}
很简单的一个自定义类,两个构造方法,和一些get,set方法,还有一个重写的toString

下面是调用反射的main方法中的代码,主要就是用反射的方法调用Person的带参构造方法给age,name赋值,在调用setId给id赋值,最后调用toString方法打印出结果

public static void main(String[] args) throws Exception {
		
		//获取Person类的Class对象
		Class<?> classType = Class.forName("Person");
		
		//调用Person类的两个参数构造方法生成对象
		Constructor constructor = classType.getConstructor(new Class[]{String.class, int.class});
		Object object = constructor.newInstance(new Object[]{"Dean",25});
		
		//获取setId方法
		Method setId = classType.getMethod("setId", new Class[]{long.class});
		
		//调用setId方法设置Id
		setId.invoke(object, new Object[]{10});
		
		//调用toString输出结果
		Method toString = classType.getMethod("toString", new Class[]{});
		String result = (String) toString.invoke(object, new Object[]{});
		System.out.println(result);
}


输出结果为:Name=Dean Age=25 Id=10

最近正在看反射的视频和资料,写这个博文的目的就是对于学习的一个总结吧。

陆续可能会更新一些我总结的更深层的反射知识,希望大家支持
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: