---------------------- android培训、java培训、期待与您交流! ----------------------
枚举是重点也是难点,为什么这样说,我觉得重点是因为它很实用,难点是因为涉及到java里面的很多知识点
比如内部内,面向对象等知识点。
如何为枚举定义一个构造方法?
首先你定义的构造方法必须定义在参数列表后,并且一般构造方法的权限是私有的(private)
SUN(1) , MON(), TUS , WEN , THUR , FRI , SAT
private WeekDay() {
System.out.println("1");
}
private WeekDay(int day ) {
System.out.println("2");
}
result:
2
1
总结:枚举对象后可以跟上参数,比如上面的 SUN(1) 它就调用第二个方法, MON()它就调用第一个方法
呵呵,看着看着真的看到了老张讲到了交通灯,交通灯的确用到了枚举实例
二.交通等问题
红灯,绿灯,黄灯三者之间变换
涉及到的重点还是内部类
import java.util.Date;
public class Enum {
public static void main(String[] args) {
new Date(300){};
}
public enum TrafficLight{
RED(30){
public TrafficLight nextlight(){
return YELLOW;
}
}
,GRENN(45){
public TrafficLight nextlight(){
return YELLOW;
}
},YELLOW(8){
public TrafficLight nextlight(){
return RED;
}
};
public abstract TrafficLight nextlight();
private int time;
private TrafficLight(int time){
this.time=time;
}
}
}
一. 反射的基石——>Class类 反射技术应用于:S S H等框架
Person p1=new Person ();
Person p2=new Person();
得到字节码的三种方式:
(1) Class c1= Date.class;//得到Date类的字节码
Class c2=Person .class;//得到Person类的字节码
(2) p1.getClass();//得到字节码
(3) Class.forName("java.lang.String");//返回字节码
第三种常用
二.案例
public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
String str="Hello.java";
Class c1=str.getClass();
Class c2=String.class;
Class c3=Class.forName("java.lang.String");
System.out.println(c1==c2);
System.out.println(c1==c3);
System.out.println(int.class==Integer.class);
System.out.println(int.class==Integer.TYPE);
System.out.println(int[].class.isPrimitive()); //判断数组类型是不是数组类型
System.out.println(int[].class.isArray()); //判断数组类型的class实例对象是不是数组
}
}
总结:在源程序出现的类型,都有各自的Class对象实例对象,如int[],void..
三.反射定义
我看了视频后老张是这么说的(他采用的一个学员的说法):反射就是把java类中的各个成分映射成各个java相应的类
我自己总结了一下:
Reflection(反射) 是Java被视为动态(或准动态)语言的一个关键性质。
这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,
包括其modifiers(诸如public, static 等等)、superclass(例如Object)、实现interfaces(例如Serializable),
也包括fields和methods的所有信息,并可于运行时改变fields内容或调用methods。
四.自己对反射的应用举例
1. 得到某个对象的属性
public Object getProperty(Object owner, String fieldName) throws Exception {
Class ownerClass = owner.getClass();
Field field = ownerClass.getField(fieldName);
Object property = field.get(owner);
return property;
}
Class ownerClass = owner.getClass():得到该对象的Class。
Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。
Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,
这里会报IllegalAccessException。
2. 得到某个类的静态属性
public Object getStaticProperty(String className, String fieldName)
throws Exception {
Class ownerClass = Class.forName(className);
Field field = ownerClass.getField(fieldName);
Object property = field.get(ownerClass);
return property;
}
Class ownerClass = Class.forName(className) :首先得到这个类的Class。
Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。
Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。
3. 执行某对象的方法
public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
Class ownerClass = owner.getClass();
Class[] argsClass = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClass[i] = args[i].getClass();
}
Method method = ownerClass.getMethod(methodName, argsClass);
return method.invoke(owner, args);
}
Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。
5~9行:配置参数的Class数组,作为寻找Method的条件。
Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。
method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。
返回值是Object,也既是该方法的返回值
五,反射的作用:——>实现框架功能
(1)框架与框架要解决的核心问题
例子:我做房子卖给用户住,有用户自己安装空调,门窗,我做的房子就是框架,
用户需要使用我的框架,把门窗插入到我的框架中。框架如工具类有区别,工具类被
用户类调用,而框架是调用用户提供的类。
(2)框架要解决的核心问题
我在写框架(房子)时,你还在读小学,我写的框架程序怎样调用让你以后写的类(门,窗)呢?
因为在写程序是无法知道别调用的类名,所以在程序中无法new一个对象的实例了,那么这是就需要
用反射来做了!
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima