---------------------- android培训、java培训、期待与您交流! ----------------------
一、枚举
1、 用普通类如何实现枚举功能,定义一个Weekday类,模拟枚举功能。
(1)定义一个私有构造函数。
(2)每一个类分别用一个公有的静态成员变量来表示。
(3)可以有若干公有方法或抽象方法.
2、 枚举中定义其他成员都必须位于定义好的元素之后。
3、 枚举中定义的构造方法必须都是私有的。
4、 枚举只有一个成员时,就可以作为一种单例的实现方式。
例、枚举小程序。
public class EnumTest {
public static void main(String[] args)
{
System.out.println(weekday.name()); //获取名称。
System.out.println(weekday.ordinal()); //获取对象的位置。
//将一个字符串变成对应的枚举对象。
System.out.println(weekday.valueOf("SUN").toString());
//获取所有枚举元素的数组(将枚举元素转换为一个数组,可以对数组操作)
System.out.println(weekday.values().length);
}
public enum WeekDay //定义一个枚举类
{
SUN(1),MON; //定义枚举中的成员。
private WeekDay()
{
System.out.println("first");
}
private WeekDay(int day)
{
System.out.println("second");
}
}
二、反射
1、 Class代表一类什么样的事物? 代表Java类。
2、如何得到各个类的字节码文件。( Class类型)
(1)类名.class,例如,System.class
(2)对象.getClass(),例如,new Date().getClass()
(3) Class.forName("类名"),例如,Class.forName("java.util.Date");
3、 Class.forName(“java.lang.String”):返回刚才加载进来的那个字节码。
作用:返回字节码,返回的方式有两种:
(1)第一种是这份字节码曾经被加载过,在java虚拟机中,可以直接被返回。
(2)Java虚拟机中还没有这份字节码,则用类加载器去加载,把加载进来的字节码缓存进java虚拟机里,以后得到这个字节码就不需要再加载了。
4、 数组类型的Class实例对象。Class.isArray()
总之:只要是在源程序中出现的类型,都有各自的Class实例对象,例如:int[],void ......
5、 反射就是把java类中的各种成分映射成相应的java类。
6、 Constructor类代表某个类中的一个构造方法。
得到某个类所有的构造方法:例子:Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();
7、 // new String(new StringBuffer(“abc”));
Constructor constructor1= String.class.getConstructor(StringBuffer.class);
String str = (String)constructor1.newInstance(new StringBuffer(“abc”));
//这里边出现两个StringBuffer,第一个StringBuffer是表示选择哪个构造方法,第二个StringBuffer表示用这个构造方法的时候还需传一个StringBuffer类型的对象。
8、 Class.newInstance()方法:
例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
9、 Method类代表某个类中的一个成员方法。
得到类中的某一个方法:
Method charAt = Class.forName(“java.lang.String”).getMethod(“charAt”,int.class);
如果传递给Method对象的invoke()方法的第一个参数为null,说明该Method对象对应的是一个静态方法。例、将一个类中的字段上的某个字符按指定字符进行替换。
import java.lang.reflect.Field;
public class ReflectTest3 {
public static void main(String[] args)throws Exception {
Test t = new Test(3,5); //创建Test类对象。
changeStringValue(t); //调用changeStringValue()方法。
System.out.println(t);
}
private static void changeStringValue(Object obj) throws Exception
{
Field[] fields = obj.getClass().getFields(); //获取这份字节码的所有字段。
//将这些字段进行迭代。
for(Field field : fields)
{
if(field.getType() == String.class) //判断字段的类型。因为是一份字节码文件,所以用等号比较。
{
String oldvalue = (String)field.get(obj); //取出对象上的变量值。
//调用replace()方法,将字段中的字符‘b’替换为字符‘a’.
String newvalue = oldvalue.replace('b','a');
field.set(obj, newvalue);//对obj对象上的字段进行设值。
}
}
}
}
class Test
{
private int x;
public int y;
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "itcast";
public Test(int x, int y)
{
super();
this.x = x;
this.y = y;
}
public String toString()
{
return str1+":"+str2+":"+str3;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------