`
schy_hqh
  • 浏览: 543164 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(基础)java中的反射

 
阅读更多

 

反射---最大的应用:反射配置文件中的类路径,动态创建对象,增强扩展性,灵活性

反射:一般被反射的类,都需要一个默认的构造函数,即无参构造函数不要被覆盖了!

 

反射构造函数

反射类的字段

反射类的方法

 

package com.gc.reflect;

public class Person {
	
	private String name;
	
	private int age;
	
	public static String country = "CN";
	
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public Person() {
		super();
	}
	
	private void privateMethod(String param) {
		System.out.println("Person.privateMethod():"+name+"---"+param);
	}
	
	public void show() {
		System.out.println("Person.show():"+this.name);
	}
	
	public static void staticMethod() {
		System.out.println("Person.staticMethod():"+country);
	}
}

 

 

package com.gc.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Reflect {
	public static void main(String[] args)throws Exception {
		//getObjectClass();
		//newObjectInstance();
		//getConstructors();
		//getObjectFields();
		getObjectMethods();
	}
	
	/**
	 * 获取字节码文件对象
	 * @throws ClassNotFoundException
	 */
	public static void getObjectClass() throws ClassNotFoundException {
		Class clazz1 = Person.class;
		Class clazz2 = new Person().getClass();
		Class clazz3 = Class.forName("com.gc.reflect.Person");//服务器:读取配置文件---反射---接口---多态
		System.out.println(clazz1==clazz2);
		System.out.println(clazz1==clazz3);
	}
	
	/**
	 * 无参构造函数创建对象
	 * @throws Exception
	 */
	public static void newObjectInstance() throws Exception {
		//加载字符串所指的类,并编译为字节码,得到Class对象
		Class clazz =  Class.forName("com.gc.reflect.Person");
		
		//调用类的无参构造函数,创建对象
		Object object = clazz.newInstance();
		
	}
	
	/**
	 * 获取带参数的构造方法,并通过这个构造函数创建对象
	 */
	public static void getConstructors() throws Exception {
		Class clazz =  Class.forName("com.gc.reflect.Person");
		//获取带参数的构造方法
		Constructor cons = clazz.getConstructor(String.class,int.class);
		//传入产生,创建对象
		Object obj = cons.newInstance("zs",20);
		
	}
	
	
	/**
	 * 获取类中的字段
	 * clazz.getFields();//本类和父类中所有的共有成员
	 * clazz.getDeclaredFields();//只获取本类,包括私有成员
	 */
	public static void getObjectFields() throws Exception {
		Class clazz =  Class.forName("com.gc.reflect.Person");
		
		Field field = clazz.getDeclaredField("name");
		
		if(!field.isAccessible()) {
			field.setAccessible(true);
		}

		Object obj = clazz.newInstance();
		
		//为字段设置值
		field.set(obj, "xiaoqiang");
		
		//获取字段的值
		Object name = field.get(obj);
		
		System.out.println(name);
	}
	
	/**
	 * 调用类中的方法
	 */
	public static void getObjectMethods() throws Exception {
		Class clazz =  Class.forName("com.gc.reflect.Person");
		Constructor cons = clazz.getConstructor(String.class, int.class);//注意:int.class != Integer.class
		Object obj = cons.newInstance("beabai",26);
		Method[] methods = clazz.getDeclaredMethods();
		for(Method m : methods) {
			if(!m.isAccessible())
				m.setAccessible(true);
			if("privateMethod".equals(m.getName()))
				m.invoke(obj, "hello");
			else 
				m.invoke(obj, (Object[])null);
		}
	}
	
}

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics