黑马程序员———反射

                                     ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一.反射:
 1.获取类的Class对象的三种方式:
  1).Object-->getClass()方法;
  2).任何类型都有一个class静态属性;
  3).Class类的静态方法forName(String className);(常用)
 2.通过Class对象获取构造方法、成员变量、成员方法:
  1).构造方法:
     ---批量的;
 *    Constructor[] getConstructors():获取所有的"公有"构造方法;
   Constructor[] getDeclaredConstructors()::获取所有的(包括私有的)构造方法;
  
   每一个Constructor内部都包含了"一个构造方法"的详细信息;
  
     ---单个的
   public Constructor getConstructor(Class ... parameterTypes):获取某个公有的构造方法
   public Constructor getDeclaredConstructor(Class... parameterTypes):获取某个构造方法(包括私有的)
     ---实例化对象:
   1).Class--->newInstance();
   2).Constructor-->newInstance();
     ---设置暴力访问:
   setAccessible(true);

public class Demo {
	public static void main(String[] args) throws Exception{
		//*********获取Class对象************//
		Class stuClass = Class.forName("cn.itcast.demo02_通过反射获取无参_有参构造方法并使用.Student");
		//*********获取所有的"公有的"构造方法*********
		Constructor[] conArray = stuClass.getConstructors();
		//遍历
		System.out.println("**********所有   公共的       构造方法***********");
		for(Constructor c : conArray){
			System.out.println(c);
		}
		
		//********获取所有的构造方法***********//
		System.out.println("**********所有构造方法(包括私有)***********");
		conArray = stuClass.getDeclaredConstructors();
		for(Constructor c : conArray){
			System.out.println(c);
		}
		/*
		 * class Class{
		 * 		public Constructor getConstructor(){
		 * 			return new Constructor();
		 * 		}
		 * }
		 * class Constructor{
		 * }
		 */
		System.out.println("**********获取单个,公有,无参的构造方法,并调用***********");
		Constructor con = stuClass.getConstructor();//获取无参的
		Object obj = con.newInstance();
		System.out.println("obj = " + obj);
		System.out.println("**********获取单个,公有,带参的构造方法,并调用***********");
		con = stuClass.getConstructor(int.class);//获取int参数的公有构造方法
		con.newInstance(20);//20就是"实参",使用这个实参去调用此构造方法
		
		System.out.println("**********获取私有,带参的构造方法,并调用***********");
		con = stuClass.getDeclaredConstructor(String.class,boolean.class);
		con.setAccessible(true);//如果是私有的,设置暴力访问
		con.newInstance("刘德华",false);
		
		
		
	}
}



  2).成员属性:
     ------批量的:
     Field[] getFields():获取所有公有的成员变量
   Field[] getDeclaredFields():获取所有成员变量(包括私有)
        ----单个的:
      Field getField():获取单个,公有的成员变量
      Field getDeclaredField():获取单个的成员变量,包括私有的
        ----为成员变量赋值:
      Filed --> set(Object obj,Object value)

public class Demo {
	public static void main(String[] args) throws Exception {
		//1.获取Class对象
		Class stuClass = Class.forName("cn.itcast.demo03_通过反射获取成员变量并使用.Student");
		System.out.println("*********获取所有公有的成员变量************");
		Field[] fieldArray = stuClass.getFields();
		for(Field f : fieldArray){
			System.out.println(f);
		}
		System.out.println("*********获取所有的成员变量(包括私有的)************");
		fieldArray = stuClass.getDeclaredFields();
		for(Field f : fieldArray){
			System.out.println(f);
		}
		System.out.println("*********获取单个公有的成员变量,并赋值************");
		Field f = stuClass.getField("name");
		//赋值前,一定要确保堆中有"对象空间",所有要先创建一个对象
		Object obj = stuClass.getConstructor().newInstance();//调用公有无参的构造方法
		f.set(obj, "刘德华");
		
		System.out.println("*********获取私有的成员变量,并赋值*********************");
		f = stuClass.getDeclaredField("address");
		f.setAccessible(true);//设置暴力访问
		f.set(obj, "北京市");
		//验证
		Student stu = (Student)obj;
		System.out.println("Student的 name = " + stu.name + " address = " + stu.getAddress());
		
		
		
	}
}



  3).成员方法:
     ----批量的:
    Method[] getMethods():获取所有公有的成员方法;
    Method[] getDeclaredMethods():获取所有的成员方法包括私有的。
      ----单个:
    Method getMethod():获取单个公有的成员方法;
    Method getDeclaredMethod():获取单个成员方法,包括私有的;
      ----调用方法:
    Method --> public Object invoke(Object obj,Object... args)

public class Demo {
	public static void main(String[] args) throws Exception{
		//1.获取Class对象
		Class stuClass = Class.forName("cn.itcast.demo04_通过反射获取成员方法并使用.Student");
		System.out.println("*****************************获取所有公有的成员方法*****************************");
		Method[] methodArray = stuClass.getMethods();//包含了父类的公有的
		for(Method m : methodArray){
			System.out.println(m);
		}
		
		System.out.println("*****************************获取所有的成员方法(包括私有的)*****************************");
		methodArray = stuClass.getDeclaredMethods();//不包含继承的;
		for(Method m : methodArray){
			System.out.println(m);
		}
		System.out.println("*****************************获取单个公有的,无参的并调用*****************************");
		Method m = stuClass.getMethod("show1");
		//实例化一个对象
		Object obj = stuClass.newInstance();
		m.invoke(obj);
		
		System.out.println("*****************************获取单个公有的,带参的,带返回值并调用*****************************");
		
		m = stuClass.getMethod("show2", String.class,int.class);
		Object result = m.invoke(obj, "张三",20);//传递实参,并接受返回值;
		System.out.println("返回值为:" + result);
		
		System.out.println("*****************************获取单个私有的,带参的并调用*****************************");
		m = stuClass.getDeclaredMethod("show5", int.class);
		m.setAccessible(true);//暴力访问
		m.invoke(obj, 20);
		
	}
}



二.设计模式:
 1.代理模式:
  --动态代理:
   1.定义一个类,实现:InvocationHandler
    2.在使用时,使用Proxy:newProxyInstance()方法产生代理对象;
 2.模板模式:
 3.装饰模式:
三.JDK5的新特性:
 1.自动装箱和拆箱
 2.泛型
 3.增强for循环
 4.静态导入
 5.可变参数
 6.枚举

package cn.itcast.demo13_自定义枚举;
public class Demo {
	public static void main(String[] args) {
	//	MyColor c1 = new MyColor();//不能直接构造对象
		MyColor c1 = MyColor.RED;
		System.out.println(c1);
		c1.show();
		
		MyColor c2 = MyColor.BLUE;
		System.out.println(c2);
		c2.show();
		
		MyColor c3 = MyColor.GREEN;
		System.out.println(c3);
		c3.show();
		
	}
}
package cn.itcast.demo13_自定义枚举;
/*
 * 多例模式的MyColor:
 * 
 * 1.将构造方法私有化。
 * 2.内部提供三个MyColor对象;作为成员变量
 */

public abstract  class MyColor {
	public static MyColor RED = new MyColor("红"){//匿名的内部子类对象
		@Override
		public void show() {
			System.out.println("红色的show()方法");
		}
	};
	public static MyColor GREEN = new MyColor("绿"){
		@Override
		public void show() {
			System.out.println("绿色的show()方法");
		}
		
	};
	public static MyColor BLUE = new MyColor("蓝"){
		@Override
		public void show() {
			System.out.println("蓝色的show()方法");
		}
		
	};
	//增加其它成员变量
	private String name;
	
	//将构造 
	private MyColor(String name){
		this.name = name;
	}
	
	public String toString(){
		return "我是:" + name + " 色的。";
	}
	//添加一个抽象方法
	public abstract void show();
	
}



 

四.JDK7的新特性:
 1.二进制字面量
 2.数字字面量可以出现下划线
 3.switch 语句可以用字符串
 4.泛型简化
 5.异常的多个catch合并
 6.try-with-resources 语句

五.JDK8的新特性:
 1.接口可以有方法了。

你可能感兴趣的:(黑马程序员———反射)