Java---实现运行任意目录下class中加了@MyTest的空参方法(实现图形界面)

说明:

因为上个代码,总是要输入完整的绝对路径,比较麻烦,于是,就写了这个小程序,直接进入文件对话框选择需要运行的class文件。

只需要提前输入完整的类名。

注意:加的MyTest必须打个包,加上:
import cn.hncu.myJuniitApp.vo.MyTest;
不然不是同一个注解呢。

测试的类:

package cn.hncu.myJuniitApp;

import cn.hncu.myJuniitApp.vo.MyTest;

public class MyJunitTest {

    public void run1(){
        System.out.println("run1().....");
    }

    @MyTest
    public void run2(){
        System.out.println("run2().....含有MyTest");
    }

    public void run3(){
        System.out.println("run3().....");
    }

    @MyTest
    public void run4(){
        System.out.println("run4().....含有MyTest");
    }

    public void run5(){
        System.out.println("run5().....");
    }

}

然后是注解类:

package cn.hncu.myJuniitApp.vo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//运行时也存在的,如果想看到运行结果,必须定义这个注解的保持性为运行时
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.METHOD)//限制这个注解只能用在方法上面
public @interface MyTest {
}

数据层:

接口:

package cn.hncu.myJuniitApp.dao.dao;

/**
 * 数据层接口
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-6
 */
public interface JunitDao {
    public Class<?> findClass(String name,String className);
}

实现类:

package cn.hncu.myJuniitApp.dao.impl;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import cn.hncu.myJuniitApp.dao.dao.JunitDao;
/**
 * 数据层的实现类
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-6
 */
public class JunitDaoImpl extends ClassLoader implements JunitDao{

    @Override
    public Class<?> findClass(String name, String className) {
        byte buf[] = loadClassData(name);
        Class c = defineClass(className, buf, 0, buf.length);
        return c;
    }

    private byte[] loadClassData(String name) {
        byte buf[]=null;
        try {
            FileInputStream in  = new FileInputStream(name);

            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            int len=0;
            byte[] b = new byte[1024];
            while((len=in.read(b))!=-1){
                bout.write(b, 0, len);
            }
            in.close();
            bout.close();
            buf=bout.toByteArray();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return buf;
    }

}

工厂方法:

package cn.hncu.myJuniitApp.dao.factory;

import cn.hncu.myJuniitApp.dao.dao.JunitDao;
import cn.hncu.myJuniitApp.dao.impl.JunitDaoImpl;

/**
 * 数据层的工厂方法
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-6
 */
public class JunitDaoFactory {
    public static JunitDao getJunitDao(){
        return new JunitDaoImpl();
    }
}

逻辑层:

接口:

package cn.hncu.myJuniitApp.business.ebi;

/**
 * 逻辑层接口
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-6
 */
public interface JunitEbi {
    public void run(String name,String className);
}

实现类:

package cn.hncu.myJuniitApp.business.ebo;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import cn.hncu.myJuniitApp.business.ebi.JunitEbi;
import cn.hncu.myJuniitApp.dao.factory.JunitDaoFactory;
import cn.hncu.myJuniitApp.vo.MyTest;
/**
 * 逻辑层的实现类
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-6
 */
public class JunitEbo implements JunitEbi{

    //通过数据层获得对象的Class
    @Override
    public void run(String name, String className) {
        Class c = JunitDaoFactory.getJunitDao().findClass(name, className);
        try {
            Object obj = c.newInstance();
            Method ms[] = c.getDeclaredMethods();//获得当前类的所有声明方法,包括私有的
            for(Method m : ms){//增强for循环遍历
                if(m.isAnnotationPresent(MyTest.class)){//如果这个方法有这个注解,就运行
                    m.invoke(obj, null);//现在知道为什么要无参了吧,这样方便很多,直接就可以调用了。
                }
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

工厂方法:

package cn.hncu.myJuniitApp.business.factory;

import cn.hncu.myJuniitApp.business.ebi.JunitEbi;
import cn.hncu.myJuniitApp.business.ebo.JunitEbo;

/**
 * 逻辑层的工厂方法
 * @author 陈浩翔
 *
 * @version 1.0  2016-5-6
 */
public class JunitEbiFactory {
    public static JunitEbi getJunitEbi(){
        return new JunitEbo();
    }
}

界面和main方法:

package cn.hncu.myJuniitApp;

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import cn.hncu.myJuniitApp.business.factory.JunitEbiFactory;

/**
 *
 * @author 陈浩翔
 * @version 1.0  2016-5-6
 */
public class myJunit extends javax.swing.JFrame {

    public myJunit() {
        initComponents();
    }

    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        tfdClassName = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        btnFileName = new javax.swing.JButton();
        btnRun = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        //获得系统屏幕分辨率
        Toolkit t = Toolkit.getDefaultToolkit() ;
        Dimension size=t.getScreenSize();  

        setBounds((int)size.getWidth()/4,(int)size.getHeight()/4,400,400);
        getContentPane().setLayout(null);

        jLabel1.setFont(new java.awt.Font("Dialog", 1, 30));
        jLabel1.setForeground(new java.awt.Color(204, 0, 0));
        jLabel1.setText("MyJunit-\u8fd0\u884c\u4efb\u610f\u7a7a\u53c2\u65b9\u6cd5");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(10, 20, 380, 80);

        tfdClassName.setFont(new java.awt.Font("Dialog", 1, 18));
        tfdClassName.setForeground(new java.awt.Color(255, 0, 0));
        getContentPane().add(tfdClassName);
        tfdClassName.setBounds(30, 180, 350, 40);

        jLabel2.setFont(new java.awt.Font("Dialog", 1, 18));
        jLabel2.setForeground(new java.awt.Color(0, 0, 255));
        jLabel2.setText("请先输入完整类名(再选择文件)");
        getContentPane().add(jLabel2);
        jLabel2.setBounds(30, 120, 310, 80);

        btnFileName.setFont(new java.awt.Font("Dialog", 1, 18));
        btnFileName.setText("\u9009\u62e9\u6587\u4ef6");
        btnFileName.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFileNameActionPerformed(evt);
            }
        });
        getContentPane().add(btnFileName);
        btnFileName.setBounds(40, 270, 110, 50);

        btnRun.setFont(new java.awt.Font("Dialog", 1, 18));
        btnRun.setText("\u8fd0\u884c");
        btnRun.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRunActionPerformed(evt);
            }
        });
        getContentPane().add(btnRun);
        btnRun.setBounds(240, 270, 110, 50);
    }

    private void btnRunActionPerformed(java.awt.event.ActionEvent evt) {
        if(fileName==null){
            JOptionPane.showMessageDialog(this, "请先选择文件!");
        }
        JunitEbiFactory.getJunitEbi().run(fileName, className);
    }

    private void btnFileNameActionPerformed(java.awt.event.ActionEvent evt) {
        JFileChooser jfc = new JFileChooser();
        //打开文件选择对话框
        int result = jfc.showOpenDialog(this);
        File file=null;
        if(result==JFileChooser.APPROVE_OPTION){//选择了文件
            file=jfc.getSelectedFile();//获得选择的文件
            //System.out.println(file.getParent());
            //System.out.println(file.getName());
            fileName = file.getParent()+"\\"+file.getName();
            className = tfdClassName.getText().trim();
            if("".equals(className)){
                JOptionPane.showMessageDialog(this, "请输入正确的完整类名!!!");
                return ;
            }
            //System.out.println(fileName);
            //System.out.println(className);
        }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new myJunit().setVisible(true);
            }
        });
    }

    private javax.swing.JButton btnFileName;//选择文件的按钮
    private javax.swing.JButton btnRun;//运行含有@MyTest的空参方法
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JTextField tfdClassName;
    private String fileName =null;
    private String className =null;

}

下面看看一些程序的图片:

先看下运行结果吧:我把那个测试类移到了d盘去了的。

run2().....含有MyTest
run4().....含有MyTest

也许有人认为一个类完全就可以解决这个问题了,你还写这么多的包,这么多类,这不是麻烦嘛。
我想说,虽然麻烦,但是可以让我们看起来结构清楚,谁调用谁也很明白,而且是面向接口编程。
这个写得更加规范,特别是以后到公司工作,基本上都是几个人开发同一个项目的,这个人写这里的,那个人写那里的,如果没有规范,怎么行呢。怎么合作开发同一个项目呢。

所以,分包是必须的。分逻辑层和数据层也是需要的。特别是一个层的铁三角,必须都要有。
接口,工厂方法,实现类,缺一不可!!!

时间: 2025-01-03 07:59:48

Java---实现运行任意目录下class中加了@MyTest的空参方法(实现图形界面)的相关文章

Java---注解、类加载器-加强-实现运行任意目录下class中加了@MyTest的空参方法

做自己的类加载器 虚拟机的核心是通过类加载器来加载.class文件,然后进行相应的解析执行.那么我们可以自己做类加载器,手动加载需要的.class以进行解析执行,从而扩展虚拟机的功能. 以下内容摘自API文档: 应用程序需要实现 ClassLoader 的子类,以扩展 Java 虚拟机动态加载类的方式. 网络类加载器子类必须定义方法 findClass 和 loadClassData,以实现从网络加载类.下载组成该类的字节后,它应该使用方法 defineClass 来创建类实例. 代码示例: 自

编程-[求助]使用java在指定的目录下实现文件的模糊搜索

问题描述 [求助]使用java在指定的目录下实现文件的模糊搜索 一.功能要求: 用户单击"选择地址"按钮,程序自动打开文件夹选择器(如图2),用户选定用户选择目标文件夹后,输入文件名(可包含"*"表示任意连续多个字符,"?"示任意一个字符),选择文件的扩展名.程序自动获取指定目录下满足条件的所有文件,并显示在窗体中(如图1).二.关键技术: 首先获取指定目录下的文件数组,再从该数组中查询满足条件的文件.三.实现的图形用户界面如下: 解决方案 已经

dnf游戏目录下tenslx.dll加载失败怎么办,dnf游戏目录下tenslx.dll加载失败解决办法

解决方案: dnf游戏目录下tenslx.dll加载失败怎么办?     1.使用游戏客户端自动维护功能.地下城与勇士游戏客户端文件如果被删除的话,会自动下载并更新的.因此,使用此功能,可顺利修复此问题:   2.在地下城与勇士的图标上右击,选择"属性",在"快捷方式"选项卡中单击"查找目标":   3.     4.在新打开的文件夹中搜索"tenslx",然后全选,选择"删除":   5.     6.

python实现搜索指定目录下文件及文件内搜索指定关键词的方法

本文实例讲述了python实现搜索指定目录下文件及文件内搜索指定关键词的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #!/usr/bin/pyt

Java中数组的创建与传参方法(学习小结)_java

(一)数组的创建 数组的创建包括两部分:数组的申明与分配内存空间. int score[]=null; //申明一维数组 score=new int[3]; //分配长度为3的空间 数组的申明还有另外一种方式: int[] score=null; //把中括号写在数组名前面 通常,在写代码时,为了方便,我们将两行合并为一行: int score[]=new int score[3]; //将数组申明与分配内存写在一行 (二)传递参数 由于初学java,这里只讨论值传递,不考虑地址传递.主要有3点

使用java web 在jsp文件及Class中连接MySQL和SQLsever 的驱动方法_java

--方法一 使用java web 在jsp文件中连接 连接MySQL的驱动 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@page import="java.sql.Connection"%> <%@page import="java.sql.DriverManager"%>

java jar 读取同一个目录下的xml

问题描述 java在jar程序内如何读取和jar在同一个目录下的xml文件或者是properties文件呢 解决方案 解决方案二:文件内容不变的话.打包进jar文件.然后使用ClassLoader的getResourceAsStream读取.若在jar包外.你可以参考这个帖子取得了jar包的路径.后面的就不用多说了.

java web-我在webapps目录下想手动创建个项目,

问题描述 我在webapps目录下想手动创建个项目, 但是只能创建文件夹.怎么解决,好想得需要管理员权限,但不知道怎么获取.初学JSP.求助..................... 解决方案 初学jsp,应该先学习下正统的开发流程.http://blog.csdn.net/chinacsharper/article/details/39777643 解决方案二: 创建的时候得按照固定的目录结构哦 解决方案三: 手动创建目录

运行同一目录下的可执行程序的VBS代码_vbs

复制代码 代码如下: Set objShell = CreateObject("WScript.shell") strCurrentDir = objShell.CurrentDirectory set fso = createobject("scripting.filesystemobject") set f=fso.getfolder(strCurrentDir) For Each i In f.files If LCase(right(i,4)) = &quo