反射机制之Class类的使用

class类的使用

默认情况(无参)

1.class类是反射的源头,不仅可以取得对象所在类的信息,也可以直接通过class类的方法进行对象的实例化

,操作正常的情况下,使用关键字new为对象实例化。如果现在已经实例化好了class对象,则可以利用class类中提供的

public T newInstance()
              throws InstantiationException,
                     IllegalAccessException

完成对象的实例化

注意:之前的三种方法是实例化Class类,而这里的newInstance是用来实例化其他的类

package InstanceDemo;
class Person{
	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;
	}
}
public class instanceDemo01 {
	public static void main(String[] args) {
		Class<?> c = null;
		
		try {
			c = Class.forName("InstanceDemo.Person");
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		Person person = null;//声明Person对象
		
		try {
			person = (Person) c.newInstance();//实例化对象
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		person.setName("yue");//设置姓名
		person.setAge(17);//设置年龄
		System.out.println(person);//内容输出调用toString方法
		
	}
}

这个例子中没有使用关键字new但是完成了对象Person的实例化,反射的作用,但是有一点必须注意:

1.在操作类中必须存在无参构造方法,否则无法进行实例化;

2.没有写构造方法的类中有一个默认的无参构造方法,但是如果写出了有参构造方法,那么就没有默认的无参的构造方法,就只有写出的构造方法,这时候必须定义无参的构造方法。

有参构造调用

使用这种方法还是要找构造方法,符合对象的实例化要求。

而如果要解决上述注意的问题,就必须明确的指定要调用的构造方法,并传递相应的参数;但是从实际开发情况来讲,一般使用反射机制来实例化对象的时候,类中都最好存在一个无参的构造方法;这样的操作比较合理。

如果要调用有参,那么就必须按照以下步骤进行:

a.通过Class类中的getConstructors()取得本类中的全部构造方法

b.向构造方法中传递一个对象数组进去,里面包含了构造方法中所需的各个参数

c.之后通过Constructor实例化对象

在Constructor中存在一个方法:

public T newInstance(Object... initargs)
              throws InstantiationException,
                     IllegalAccessException,
                     IllegalArgumentException,
                     InvocationTargetException

传递初始化参数,以进行对象的实例化操作。

明确调用有参构造,实例化对象:

package InstanceDemo;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

class P{
	private String name;
	private int age;
	public P(String name,int age) {
		this.name = name;
		this.age = 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;
	}
}
public class instanceDemo02 {
	public static void main(String[] args) {
		Class<?> c = null;
		
		try {
			c = Class.forName("InstanceDemo.P");
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		P person = null;//声明Person对象
		Constructor<?> cons[] = null;
		cons = c.getConstructors();
		try {
			person = (P) cons[0].newInstance("yu",17);//实例化对象
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(person);//内容输出调用toString方法
		
	}
}

但是从实际角度看,如果用反射进行对象的实例化操作,最好在类中存在无参构造。

1.这是Class使用最多的功能

2.在使用Class实例化对象的时候,必须保证存在一个无参构造,否则无法使用

3.如过想调用有参构造进行对象的实例化操作则必须使用Constructor类完后,此类

表示构造方法,并通过可变参数传递需要的数据,(数组)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值