Saturday, September 09, 2008

动态类加载及反射演示类

package org.mytest;
 
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
/*
 * 动态类加载及反射演示类
 */
 
publicclass DynamicClassLoader {
    private String attribute = "我是DynamicClassLoader类的属性!";
    public String str2 = "hi";
 
    public String getAttribute() {
        returnattribute;
    }
 
    public DynamicClassLoader() {}
 
    publicvoid setAttribute(String attribute) {
        this.attribute = attribute;
    }
 
    publicint getAttribute2() {
        return 110;
    }
 
    protectedvoid protectedMethod() {}
 
    privatevoid privateMethod() {}
 
    publicstaticvoid main(String s[]) throws ClassNotFoundException,
            InstantiationException, IllegalAccessException,
            IllegalArgumentException, InvocationTargetException {
        // \\\\\\\\\\\\\\\\\\\\\\动态加载//////////////////
        DynamicClassLoader dcl0 = new DynamicClassLoader();// 这是我们通常创建一个类实例的做法--new
        System.out.println("new类实例,并打印实例dcl0的属性 = " + dcl0.getAttribute());
 
        Class class1 = Class.forName("org.mytest.DynamicClassLoader");
        DynamicClassLoader dcl1 = (DynamicClassLoader) class1.newInstance();
        System.out.println("Class.forName动态加载获得的类实例,并打印实例dcl1的属性 = " + dcl1.getAttribute());
 
        Class class2 = ClassLoader.getSystemClassLoader().loadClass("org.mytest.DynamicClassLoader");
        DynamicClassLoader dcl2 = (DynamicClassLoader) class2.newInstance();
        System.out.println("ClassLoader.loadClass动态加载获得的类实例,并打印实例dcl2的属性 = "    + dcl2.getAttribute());
 
        System.out.println("dcl1==dcl2" + (dcl1==dcl2));
        System.out.println("dcl1==dcl0" + (dcl1==dcl0));
        System.out.println("dcl2==dcl0" + (dcl1==dcl0));
       
        System.out.println("dcl0.getClass().getClassLoader()" + (dcl0.getClass().getClassLoader()));
        System.out.println("dcl1.getClass().getClassLoader()" + (dcl1.getClass().getClassLoader()));
        System.out.println("dcl2.getClass().getClassLoader()" + (dcl2.getClass().getClassLoader()));
        //讲解如果要求按照业务逻辑定义自己的对象比对策略(如hibernatepo可以仅仅比对
        //主键、主键等则两个po等),则重写(覆盖)equals方法和hashcode方法
       
        // ///////////////方法反射//////////////////
        DynamicClassLoader d = new DynamicClassLoader();
        Object o = (Object) d;
        System.out.println("o.getClass() = " + o.getClass());
 
        Method[] methods = o.getClass().getMethods();
        System.out.println("methods.length = " + methods.length);
        for (int i = 0; i < methods.length; i++) {
            System.out.print("method" + (i + 1) + ":\t");
            System.out.println(methods[i]);
        }
        System.out.println("---------------------");
 
        Method[] methods2 = o.getClass().getDeclaredMethods();
        System.out.println("methods2.length = " + methods2.length);
        for (int i = 0; i < methods2.length; i++) {
            System.out.print("method" + (i + 1) + ":\t");
            System.out.println(methods2[i]);
        }
   
        /////////////////穿插属性反射//////////////////
        System.out.println("--------穿插属性反射--------");
        Field[] fields = o.getClass().getDeclaredFields();
        System.out.println(fields.length);
        for(int i = 0; i<fields.length; i++){
            System.out.print("field" + (i + 1) + ":\t");
            System.out.println(fields[i]);
        }
        System.out.println("---------继续方法反射---------");
       
        /////////////////继续方法反射//////////////////
        for(int i = 0; i<methods.length; i++){
            System.out.print("method" + (i + 1) + ":\t");
            System.out.println(methods[i]);
            Method method = methods[i];
            String methodName = method.getName();
            String returnType = method.getReturnType().getName();
           
            if(methodName.startsWith("get")&&!methodName.startsWith("getClass")){
                if(returnType.equals("java.lang.String")){
                    String returnval = (String)method.invoke(d,null);
                    System.out.println("java.lang.String reval = "+returnval);
                }elseif(returnType.equals("String")){
                    String returnval = (String)method.invoke(d,null);
                    System.out.println("String reval = "+returnval);
                }elseif(returnType.equals("java.lang.Integer")){
                    Integer returnval = (Integer)method.invoke(d,null);
                    System.out.println("Integer reval = "+returnval);
                }elseif(returnType.equals("int")){
                    Integer returnval = (Integer)method.invoke(d,null);
                    System.out.println("int reval = "+returnval);
                }
            }
        }
    }
}
 
/*
 * 几点结论:
 * 对于private的方法getMethods()不反射、getDeclaredMethods()反射;
 * 对于protected的方法getMethods()不反射、getDeclaredMethods()反射;
 * getMethods()反射继承的和自身的public方法、getDeclaredMethods()反射自身声明的所有方法。
 */

Tags: J2SE


Saturday, September 09, 2008

microemulator手机模拟器

已将我写的一个J2ME Midlet 上传至  使用开源Applet模拟器 microemulator
http://www.zhangqingtian.cn/microemulator/Billiards.html
如果看不到下面的程序请到 http://java.com 下载java插件

Tags: J2ME


Wednesday, September 09, 2008

今天教师节是个好日子

      大学最后一个教师节,本打算想有联系的老师发写祝福,但是今天忙于申请域名,修改博客耽误了.
今天庆祝我的域名申请成功!在此特别的感谢各位pyer友们,感谢富有激情的python讨论组!尽管经常灌水现象,愤世嫉俗,呵呵,但是是我最喜欢最热闹的群了,以后继续向里面的各位高手们多多学习。对了还要感谢Google!感谢开源!

今天还是欧洲研究黑洞的日子,python讨论组讨论的热火朝天.但愿地球不会很快灭亡,呵呵。我还没有毕业,还没有....还没有干很多事呢!希望这件事是好事!

还有,今天经理打电话让明天去上班实习!心情很复杂,但一定要在公司好好工作!在其位谋其职!马上这件事告诉了几个好友和家人。感觉经理是个诚实有能力的人!
 

欧洲大型强子对撞机正式启动

Tags: 生活流水帐


Wednesday, September 09, 2008

java类初始化顺序

1、类只有在使用New调用创建的时候才会被JAVA类装载器装入

2JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。

先初始化父类的静态代码--->初始化子类的静态代码-->

初始化父类的非静态代码--->初始化父类构造函数--->

初始化子类非静态代码--->初始化子类构造函数

3、创建类实例时,首先按照父子继承关系进行初始化

4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从

本类继承的子类的初始化块执行,最后是子类的构造方法

5、类消除时候,首先消除子类部分,再消除父类部分

class A {
    static {
       System.out.print("1");
    }
 
    A() {
       System.out.print("2");
    }
}
 
class B extends A {
    static {
       System.out.print("A");
    }
 
    B() {
       System.out.print("B");
    }
}
 
publicclass ConstructorAndStaticBlock {
    publicstaticvoid main(String[] args) {
       A ab = new B();
       ab = new B();
    }
}

执行结果:

1A2B2B

Tags: J2SE