`

反射示例

阅读更多

 很熟悉的示例吧!熟悉一下反射机制以及reflect的SDK
public class ViewClassInfoFrame extends JFrame implements ActionListener{
    JTextField classnameField = new JTextField();
    JButton  viewinfoButton = new JButton();
    JLabel hintLabel = new JLabel();
    JTextArea infoTextArea  = new JTextArea();
    JScrollPane infoScrollPane = new JScrollPane();
    TitledBorder titledBorder;
    
    JPanel  upPanel = new JPanel();
    JPanel  centerPanel  = new JPanel();
    
    BorderLayout mainFrameBorderLayout = new BorderLayout();
    BorderLayout centerPanelBorderLayout = new BorderLayout();
    BorderLayout upPanelBorderLayout = new BorderLayout();
   
    /** 构造函数 */
    public ViewClassInfoFrame() {
        enableEvents(AWTEvent.WINDOW_EVENT_MASK);
        init();
        validate();
    }
    /**初始化窗口*/
    private void init(){
        
        classnameField.setFont(new Font("Dialog",0,15));
        classnameField.setSelectedTextColor(Color.white);
        classnameField.setText("");
        
        viewinfoButton.setFont(new Font("Dialog",0,13));
        viewinfoButton.setText("查看类详细信息");
        viewinfoButton.addActionListener(this);
        hintLabel.setFont(new Font("Dialog",0,13));
        hintLabel.setText("类路径");
        
        infoTextArea.setFont(new Font("Dialog",0,14));
        infoTextArea.setEditable(false);
        infoTextArea.setText("");
        
        titledBorder = new TitledBorder(BorderFactory.createEtchedBorder(Color.white,new Color(134,134,134)),"结果信息");
        infoScrollPane.setBorder(titledBorder);
        infoScrollPane.getViewport().add(infoTextArea,null);
        
        upPanel.setLayout(upPanelBorderLayout);
        centerPanel.setLayout(centerPanelBorderLayout);
        upPanel.add(hintLabel,BorderLayout.NORTH);
        upPanel.add(classnameField,BorderLayout.CENTER);
        upPanel.add(viewinfoButton,BorderLayout.SOUTH);
        
        centerPanel.add(infoScrollPane);
        
        this.getContentPane().setLayout(mainFrameBorderLayout);
        this.setSize(new Dimension(450,360));
        this.setTitle("使用反射机制查看类信息");
        
        this.getContentPane().add(upPanel,BorderLayout.NORTH);
        this.getContentPane().add(centerPanel,BorderLayout.CENTER);
        
        this.getRootPane().setDefaultButton(viewinfoButton);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public void actionPerformed(ActionEvent e) {
        String classname = classnameField.getText();
        StringBuffer  buffer  =  new StringBuffer();
        try {
            //动态加载类  获取类对象
            Class c = Class.forName(classname);
            buffer.append("/**类声明**/ \n");
            buffer.append(getClassStatement(c));
            buffer.append("\n");
            
            buffer.append("/**字段**/");
            buffer.append(getFields(c));
            
            buffer.append("/**构造函数**/");
            buffer.append(getConstructors(c));
            buffer.append("/**方法**/");
            buffer.append(getMethods(c));
            buffer.append("} \n");
        } catch (Exception e1) {
            JOptionPane.showMessageDialog(this, "没有找到类:" + e1.getMessage());
        }
        infoTextArea.setText(buffer.toString());
    }
    public String getClassStatement(Class c){
        StringBuffer buffer = new StringBuffer();
        if(c.getName().equals("java.lang.object")){
            buffer.append("public class Ojbect{");
            return buffer.toString();
        }else {
            String supername = c.getSuperclass().getName();
            buffer.append("public class").append(c.getName());
            buffer.append("extends").append(supername).append(";");
        }
        return buffer.toString();
    }
    /**
     * 获取类的属性
     * @param c
     * @return
     */
    public String getFields(Class c){
        StringBuffer  buffer = new StringBuffer();
        Field field = null;
        Field [] fields = c.getFields(); 
        for (int i = 0; i < fields.length; i++) {
            field = fields[i];
            buffer.append(Modifier.toString(field.getModifiers())).append(" ");
            Class type = field.getType();
            buffer.append(type.getName()).append(" ");
            buffer.append(field.getName()).append(";\n");//获取属性名
        }
        return buffer.toString();
    }
    /**
     * 获取类的构造方法
     * @param c
     * @return String
     */
    public String getConstructors(Class c){
        StringBuffer buffer = new StringBuffer();
        Constructor [] constructors = c.getDeclaredConstructors();
        Constructor constructor = null;
        for (int i = 0; i < constructors.length; i++) {
            constructor = constructors[i];
            buffer.append(Modifier.toString(constructor.getModifiers())).append(" ");
            buffer.append(constructor.getName()).append("(");
            //获取参数类型
            Class[] paramsTypes= constructor.getParameterTypes();
            Class class1= null;
            for (int j = 0; j < paramsTypes.length; j++) {
                class1 = paramsTypes[j];
                if (j==(paramsTypes.length-1)) {
                    buffer.append(class1.getName());
                }else {
                    buffer.append(class1.getName()).append(",");
                }
            }
            buffer.append(")");
            //获取方法声明的异常
            Class[] exceTypes = constructor.getExceptionTypes();
            for (int j = 0; j < exceTypes.length; j++) {
                class1 = exceTypes[j];
                if (j==0) {
                    buffer.append("throws");
                } 
                if(j==(exceTypes.length-1)){
                    buffer.append(class1.getName());
                } else {
                    buffer.append(class1.getName()).append(", ");
                }
            }
            buffer.append("\n");
            
        }
        
        
        return buffer.toString();
    }
    /**
     * 获取类的方法
     * @param c
     * @return String
     */
    public String getMethods(Class c){
        StringBuffer buffer = new StringBuffer();
        Method[] methods= c.getMethods();
        Method method = null;
        for (int i = 0; i < methods.length; i++) {
            method = methods[i];
            buffer.append(Modifier.toString(method.getModifiers())).append(" ");
            Class returnType = method.getReturnType();
            buffer.append(returnType.getName()).append(" ");
            buffer.append(method.getName()).append("(");
            //获取方法参数
            Class[] paramTypes =method.getParameterTypes();
            Class class1 = null;
            for (int j = 0; j < paramTypes.length; j++) {
                class1 = paramTypes[j];
                if (j==(paramTypes.length-1)) {
                    buffer.append(class1.getName());
                } else {
                    buffer.append(class1.getName()).append(", ");
                }
            }
            buffer.append(")");
          //获取方法声明的异常
            Class[] exceTypes = method.getExceptionTypes();
            for (int j = 0; j < exceTypes.length; j++) {
                class1 = exceTypes[j];
                if (j==0) {
                    buffer.append("throws");
                } 
                if(j==(exceTypes.length-1)){
                    buffer.append(class1.getName());
                } else {
                    buffer.append(class1.getName()).append(", ");
                }
            }
            buffer.append("\n");
        }
        return buffer.toString();
    }
    
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        ViewClassInfoFrame frame = new ViewClassInfoFrame();
        
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        if (frameSize.height>screenSize.height) {
            frameSize.height= screenSize.height;
        }
        if (frameSize.width>screenSize.width) {
            frameSize.width= screenSize.width;
        }
        frame.setLocation((screenSize.width-frameSize.width)/2, (screenSize.height-frameSize.height)/2);
        frame.setVisible(true);
    }

}
 
分享到:
评论

相关推荐

    Java反射示例代码.rar

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。

    c#中反射示例

    现在,让我们看一个简单的VS2010中的C#反射示例: ```csharp using System; using System.Reflection; public class MyClass { public string MyProperty { get; set; } public void MyMethod(int input) { ...

    C#反射示例 动态生成方法

    总的来说,`C#反射示例 动态生成方法`这个示例可能包含了一个创建、执行动态方法的完整流程,展示了C#在运行时的强大能力。通过学习这个示例,开发者可以更好地理解如何在自己的应用程序中利用反射来实现灵活的代码...

    VB.NET 反射 示例Demo(项目用)

    这个“VB.NET 反射 示例Demo(项目用)”是专为初学者设计的,旨在帮助理解如何在实际项目中应用反射。下面将详细介绍VB.NET反射的基本概念和示例。 反射的原理: 反射允许代码在运行时动态地获取类型信息,并且...

    java类反射示例源码

    在"java类反射示例源码"中,我们可以深入理解这个概念并学习如何在实际开发中应用。 反射的使用通常涉及到以下关键知识点: 1. **Class类**: 在Java中,`java.lang.Class`类是所有类的通用表示,每个类都有一个与...

    java反射示例代码

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在Java中,反射主要用于以下场景:代码生成、元数据访问、插件系统、框架设计等。...

    C# 反射示例 demo

    根据提供的文件信息,本文将详细解释C#反射的基本概念、用途以及通过给出的代码示例来深入了解其工作原理。 ### C# 反射基本概念 C#中的**反射**是一种强大的功能,允许程序在运行时获取类型的信息并创建或操作...

    Flex 反射示例

    以下是一个简单的Flex反射示例,展示了如何动态地创建和调用类的方法: ```actionscript import flash.utils.getDefinitionByName; import flash.events.Event; // 定义一个类 class MyClass { public function ...

    反射简单示例

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法的信息。...在"反射示例"中,我们通常会看到如何运用上述概念创建简单的示例,以演示反射的基本用法。

    .net反射示例,很有肜的咯

    .NET反射是.NET Framework提供的一种强大的工具,它允许程序在运行时检查自身,发现并操作类型、成员、属性、方法等信息。在.NET编程中,反射提供了动态类型绑定和执行的能力,使得开发者能够在运行时创建对象、调用...

    C#反射示例

    C#反射是.NET框架提供的一种强大机制,它允许在运行时检查类型信息并动态操作代码。这个机制使得程序能够自我检查和自我...这些示例将帮助你更好地理解如何在实际项目中运用反射,并掌握如何处理动态类型和方法调用。

    JAVA反射示例

    这样的示例有助于理解如何在实际项目中使用反射,以及它在解决某些问题时的威力。 然而,需要注意的是,虽然反射提供了很多便利,但也存在一定的风险和性能开销。过度使用反射可能导致代码难以理解和维护,而且它...

    C# 反射工厂示例

    C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例C# 反射工厂示例

    java使用dom4j解析xml配置文件实现抽象工厂反射示例

    在本示例中,DOM4J被用来读取XML配置文件,实现一个抽象工厂模式和反射机制的结合。这种方式使得代码更具灵活性和可扩展性,因为配置信息可以在运行时动态加载,而不需要对代码进行硬编码。 首先,我们来看配置文件...

    C#反射示例

    在C#编程语言中,反射是一个强大的特性,它允许运行时的代码检查、访问和修改自身的行为。通过反射,开发者可以动态地创建对象、获取类型信息、调用方法和访问属性,无需预先知道具体的类名或方法名。下面将详细探讨...

    qt反射实例.zip

    在“qt反射实例.zip”这个压缩包中,包含了一个关于Qt反射机制的开发实例。反射是一种编程概念,它允许程序在运行时检查自身结构,如类、对象、方法等,并能够动态地操作这些信息。在C++中,Qt提供了一套完整的反射...

    Java反射机制总结

    以下是一个简单的Java反射示例,展示了如何使用反射来获取类的信息: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.for...

    c#反射调用方法示例

    反射是一种允许用户获得类信息的C#功能,Type对象映射它代表的底层对象; 在.Net 中, 一旦获得了Type对象,就可以使用GetMethods()方法获取此类型支持的方法列表;该方法的两种形式: MethodInfo [] GetMethods() ...

    原创asp.net反射超强实现, js反射

    下面是一个简单的C#反射示例: ```csharp using System; using System.Reflection; public class MyClass { public void MyMethod() { Console.WriteLine("Hello, Reflection!"); } } class Program { static...

    反射机制和类加载机制学习总结

    以下是一个简单的反射示例: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0]); // 通过类名获取Class对象...

Global site tag (gtag.js) - Google Analytics