黑马程序员———反射

                                     ------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一.反射:
 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);

<span style="font-family:KaiTi_GB2312;font-size:14px;">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);
		
		
		
	}
}
</span>



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

<span style="font-family:KaiTi_GB2312;font-size:14px;">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());
		
		
		
	}
}
</span>



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

<span style="font-family:KaiTi_GB2312;font-size:14px;">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);
		
	}
}
</span>



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

<span style="font-family:KaiTi_GB2312;font-size:14px;">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();
		
	}
}
</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">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();
	
}
</span>



 

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值