java1234开源博客系统
博客信息

java反射-java Class基本使用

0
发布时间:『 2016-11-18 11:41』  博客类别:Java核心基础  阅读(7466) 评论(0)

java反射-java Class基本使用


通过Class类获取对象完整包类名:

我们新建一个Student类:

package com.java1234.chap07.sec01;

public class Student {

}

我们新建一个测试类:

package com.java1234.chap07.sec01;

public class Test01 {

	public static void main(String[] args) {
		Student student=new Student();
		System.out.println(student.getClass().getName());
	}
}

运行输出:

com.java1234.chap07.sec01.Student


这里对象.getClass() 调用的是Object类的getClass() 得到Class对象 然后再调用Class里的getName()方法,获取到完整包路径类;


通过完整包路径类型来实例化Class对象:

package com.java1234.chap07.sec01;

public class Test02 {

	public static void main(String[] args) {
		try {
			Class<?> c=Class.forName("com.java1234.chap07.sec01.Student");	
			System.out.println(c.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行输出:

com.java1234.chap07.sec01.Student


通过得到Class对象,我们可以通过Class对象得到com.java1234.chap07.sec01.Student类的完整结构;



通过完整包路径类型来实例化Class对象,再通过Class对象获取Student类实例:

我们先改写下Student类:

package com.java1234.chap07.sec01;

public class Student {

	private String name;
	private Integer age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}


我们写个测试类:

package com.java1234.chap07.sec01;

public class Test03 {

	public static void main(String[] args) {
		Class<?> c=null;
		try {
			c=Class.forName("com.java1234.chap07.sec01.Student");	
			System.out.println(c.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Student s=null;
		try {
			s=(Student) c.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		s.setName("小锋");
		s.setAge(28);
		System.out.println(s);
	}
}


我们改下上面的Student 加下有参构造方法,这样使得Student类没有默认无参构造方法:

package com.java1234.chap07.sec01;

public class Student {

	private String name;
	private Integer age;
	
	
	
	public Student(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
	
}

然后我们再运行上面的测试类:

QQ鎴浘20161118113800.jpg


报错了 找不到默认构造方法;


在这种情况下,我们可以通过Class类来获取Student类里的构造方法,再调用构造方法即可,我们前面说过,可以通过反射获取整个类的结构,

包括 属性 方法 构造方法 等等。


我们给下测试代码:

package com.java1234.chap07.sec01;

import java.lang.reflect.Constructor;

public class Test04 {

	public static void main(String[] args) {
		Class<?> c=null;
		try {
			c=Class.forName("com.java1234.chap07.sec01.Student");	
			System.out.println(c.getName());
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Student s=null;
		Constructor<?>[] cons=c.getConstructors();
		try {
			s=(Student) cons[0].newInstance("小锋",28);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(s);
	}
}


运行输出:

com.java1234.chap07.sec01.Student

Student [name=小锋, age=28]




关键字:   java反射  
关注Java1234微信公众号
博主信息
Java1234_小锋
(知识改变命运,技术改变世界)
Powered by Java1234 V3.0 Copyright © 2012-2016 Java知识分享网 版权所有