java反射机制模式

第十八章:Java Reflection

 

1.   JAVA反射机制:

      JAVA反射机制是在运行状态中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

     JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。

1.1Java反射机制的好处:

Java反射机制通过new来实例化对象只需要(包.类),这样使得反射机制灵活性更高。




第一:获取Class对象属性

package com.reflection.calss;

public class Book {
	private String name;
	private int no;
	private String type;
   
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getType() {
		return type;
	}
	public void setType(String type) {
		this.type = type;
	}
	   
   
}

测试类:

package com.reflection.calss;


/*
 * 第一: 反射   Class 对象的机制与实现:
 * */
public class Test {
	public static void main(String[] args) {
		Class dom1 = null;
		Class dom2 = null;
		Class dom3 = null;
	
		try {
			//第一种:最重要
			dom1 = Class.forName("com.reflection.calss.Book");
			System.out.println("第一种:"+ dom1);
			//第二种
			Book book = new Book();
			//Object bk = book.getClass();
			Class bk = book.getClass();
			System.out.println("第二种:"+ bk);
			//第三种
			dom3 = Book.class;
			System.out.println("第三种:"+ dom3);
			
			//先获取class对象   再获取实例化对象
			Book book3 = (Book) dom3.newInstance();
			System.out.println("实例化对象和内存地址:"+ book3);
			
			
			
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
}


第二: Method对象的机制与实现

package com.reflection.method;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MethodDom {
	
	//获取方法名   
	public void  MethodTest(Object ob){
		Class cl = ob.getClass();
		Method[]  me = cl.getDeclaredMethods();
		for(Method mm : me){
			System.out.println("方法名称:" + mm.getName() );
			System.out.println("修饰符:" + mm.getModifiers() );
			System.out.println("" + mm.getReturnType() + " \n  ");
		}
	}
	
	//获取实例化方法   
	public void showuser(Object ob){
		
		try {
			//方法名  无参数
			Class  cl = ob.getClass();
			Method me= cl.getMethod("getName", null);
			me.invoke(ob, new Object[0]);
			//方法名 一参数
			Method ms = cl.getMethod("setName", String.class);
			ms.invoke(ob, "set 调用");
			//方法名  多参数
			Class[] cll = {String.class, int.class};
			Method m1 = cl.getMethod("Test", cll);
			Object[] boj = {"哈哈哈",123};
			m1.invoke(ob, boj);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
}

测试类:

package com.reflection.method;

import com.reflection.field.Book;

public class TestMethod {
	public static void main(String[] args) {
	    Book ob = new Book();
	    ob.setName("跑男第十八季");
	    ob.setType("娱乐");
	    ob.setNo(90);

	    MethodDom te = new MethodDom();
	    //te.MethodTest(ob);
	    te.showuser(ob);
	    System.out.println(ob.getName());
	    System.out.println(ob.getName());

   }
}


第三: Field 对象的机制与实现

package com.reflection.field;

import java.lang.reflect.Field;

public class ShowField {
	
		//第一种:方法  接收传递过来的class对象
		public void show(Class c){
			//getFields只能获取共有属性    getDeclaredFields可以获取私有属性
			Field[] fi = c.getDeclaredFields();
			for(Field ff : fi){
				System.out.println(ff.getName());
				System.out.println(ff.getType());
			}
		}
		
		//第二种: 接收传递过来的实体类对象   对象的属性  和 值
		public void obshow(Object ob){
			Class  cs = ob.getClass();
			Field[] fo = cs.getDeclaredFields();
			
			for(Field e : fo ){
				try {
					//私有属性可见
					e.setAccessible(true);
					System.out.println("名:"+e.getName()+ "  "  + "值:"+e.get(ob));
					
					
				} catch (IllegalArgumentException e1) {
					e1.printStackTrace();
				} catch (IllegalAccessException e1) {
					e1.printStackTrace();
				}
			  }
		}	
}

测试类:

package com.reflection.field;

public class Test {
	public static void main(String[] args) {
		Book bo = new Book();
		bo.setNo(1);
		bo.setName("斗破苍穹");
		bo.setType("玄幻");
		
		ShowField ft = new ShowField();
	    ft.show(Book.class);
		ft.obshow(bo);
	}
}



转载于:https://my.oschina.net/czyandy/blog/692290

你可能感兴趣的:(java)