一.反射:
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.接口可以有方法了。