java反射机制 一

1、通过无参构造实例化对象

package com.njust.zht.Reflection;

public class Dog {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	private String color;
	private int age;
	public void wangwang(){
		System.out.println("汪汪叫。。");
		System.out.println("dog name="+name);
		System.out.println("dog color="+color);
		System.out.println("dog age="+age);
	}
	
}

package com.njust.zht.Test1;

import com.njust.zht.Reflection.Dog;

public class Test1 {
	
	
	public static void main(String[] args) throws ClassNotFoundException {
		Class<?> demo1=null;
//		Class<?> demo2=null;
//		Class<?> demo3=null;
		demo1=Class.forName("com.njust.zht.Reflection.Dog");
		
		Dog dog=null;
		try {
			dog=(Dog) demo1.newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		dog.setName("lili");
		dog.setColor("black");
		dog.setAge(2);
		dog.wangwang();
		
		
	}
}

汪汪叫。。
dog name=lili
dog color=black
dog age=2

如果在构造函数的时候加上参数,如:

public Dog(){

}

java.lang.InstantiationException: com.njust.zht.Reflection.Dog
	at java.lang.Class.newInstance(Unknown Source)
	at com.njust.zht.Test1.Test1.main(Test1.java:16)
Exception in thread "main" java.lang.NullPointerException
	at com.njust.zht.Test1.Test1.main(Test1.java:24)

所以这种方式不能带有参数的构造函数。

2、通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)

package com.njust.zht.Test1;

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

import com.njust.zht.Reflection.Dog;

public class Test1 {
	
	
	public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, InvocationTargetException {
		Class<?> demo=null;
//		Class<?> demo2=null;
//		Class<?> demo3=null;
		demo=Class.forName("com.njust.zht.Reflection.Dog");
		
		Dog dog1=null;
		Dog dog2=null;
		Dog dog3=null;
		Dog dog4=null;
		try {
			//获取所有的构造函数
			Constructor<?> cons[]=demo.getConstructors();
			
			 System.out.println(cons[0]);
		     System.out.println(cons[1]);
		     System.out.println(cons[2]);
		     System.out.println(cons[3]);
			
			dog4=(Dog) cons[0].newInstance("niuniu",15,"red");/************************************/
			dog3=(Dog) cons[1].newInstance("lolo",20);
			dog2=(Dog) cons[2].newInstance("kity");
			dog1=(Dog) cons[3].newInstance();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(dog1);
		System.out.println(dog2);
		System.out.println(dog3);
		System.out.println(dog4);
		
		
	}
}
上面的标记
/************************************/
出如果参数设置不对应就会出错。可以先输出下构造函数里面的参数解决。在我这里是按照参数从多到少的顺序配置的。(本人在此处折腾了几个小时,最后想到输出构造函数的方法解决之)如果设置错误就会有如下的错误:

Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
        at javaGXJS.fanShe.reflect.main(dfgfdgfdg.java:45)



你可能感兴趣的:(java,对象)