java反射机制例子,反编译,以及通过读取配置文件降低耦合

本文不多做文字描述,通过代码可以说明一切,简单直观。

//这边以反编译String类为例子,将反编译结果输入到文件。

1.ReflectTest.java

  1 import java.io.File;
  2 import java.io.FileReader;
  3 import java.io.FileWriter;
  4 import java.lang.reflect.Constructor;
  5 import java.lang.reflect.Field;
  6 import java.lang.reflect.Method;
  7 import java.lang.reflect.Modifier;
  8 import java.util.Properties;
  9
 10 /**
 11  *
 12  */
 13
 14 /**
 15  * @author NXF
 16  *
 17  */
 18 public class ReflectTest {
 19
 20     /**
 21      * @param args
 22      */
 23     public static void main(String[] args) throws Exception {
 24         // TODO Auto-generated method stub
 25         //1.创建属性对象
 26         Properties p = new Properties();
 27
 28         //2.创建流
 29         FileReader fr = new FileReader("./src/classInfo.properties");
 30
 31         //3.加载
 32         p.load(fr);
 33
 34         //4.关闭流
 35         fr.close();
 36
 37         //通过key获取value
 38         String className = p.getProperty("className");
 39         //通过反射机制创建对象
 40         Class c = Class.forName(className);
 41
 42         //创建对象
 43         Object o = c.newInstance();
 44
 45
 46         new ReflectTest().printClass(c);
 47
 48
 49     }
 50
 51     public void printClass(Class c) throws Exception
 52     {
 53         StringBuffer sb = new StringBuffer();
 54
 55         sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
 56         sb.append(getFileds(c));
 57         sb.append(getConstructors(c));
 58         sb.append(getMethods(c));
 59         sb.append("}\n");
 60         sb.append(getSuperClass(c));
 61         sb.append(getFiled(c));
 62         sb.append(getMethod(c));
 63
 64         System.out.println(sb);
 65         FileWriter fw = new FileWriter(new File("./src/classInfo.txt"));
 66         fw.write(sb.toString());
 67         fw.close();
 68
 69     }
 70
 71     /**
 72      * 根据Class c对象获取所有属性
 73      * @param c
 74      * @return
 75      */
 76     public String getFileds(Class c) {
 77         //获取所有的属性?
 78         Field[] fs = c.getDeclaredFields();
 79
 80         StringBuffer sb = new StringBuffer();
 81
 82         //sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");
 83         sb.append("///////////////////////////////////////the Fileds of Class/////////////////////////////////////////////\n");
 84         for(Field field:fs){
 85             sb.append("\t");
 86             sb.append(Modifier.toString(field.getModifiers())+" ");
 87             sb.append(field.getType().getSimpleName() + " ");
 88             sb.append(field.getName()+";\n");
 89         }
 90         //sb.append("}");
 91         sb.append("///////////////////////////////////////////////////////////////////////////////////////////////////////\n");
 92         //System.out.println(sb);
 93         return sb.toString();
 94     }
 95
 96     /**
 97      * 根据Class c 对象获取所有方法
 98      * @param c
 99      * @return
100      */
101     public String getMethods(Class c)
102     {
103
104         Method[] ms = c.getDeclaredMethods();
105         //反编译
106         StringBuffer sb = new StringBuffer();
107 //        sb.append(Modifier.toString(c.getModifiers())+" class ");
108 //        sb.append(c.getSimpleName()+"{\n");
109         sb.append("///////////////////////////////////////the Methods of Class/////////////////////////////////////////////\n");
110         for(Method m:ms){
111             sb.append("\t");
112             sb.append(Modifier.toString(m.getModifiers())+" ");
113             sb.append(m.getReturnType().getSimpleName()+" ");
114             sb.append(m.getName()+"(");
115
116             //形参
117             Class[] parameterTypes = m.getParameterTypes();
118             for(int i=0;i<parameterTypes.length;i++){
119                 Class parameterType = parameterTypes[i];
120                 if(i==parameterTypes.length-1){
121                     sb.append(parameterType.getSimpleName());
122                 }else{
123                     sb.append(parameterType.getSimpleName()+",");
124                 }
125
126             }
127
128             sb.append("){}\n");
129         }
130
131         //sb.append("}");
132         sb.append("///////////////////////////////////////////////////////////////////////////////////////////////////////\n");
133         //System.out.println(sb);
134         return sb.toString();
135     }
136
137     /**
138      * 通过Class c 获取所有构造方法
139      * @param c
140      * @return
141      */
142     public String getConstructors(Class c)
143     {
144         //获取所有的构造
145         Constructor[] cs = c.getDeclaredConstructors();
146         //反编译
147         StringBuffer sb = new StringBuffer();
148
149         //sb.append(Modifier.toString(c.getModifiers())+" class "+c.getSimpleName()+"{\n");
150         sb.append("///////////////////////////////////////the Constructors of Class/////////////////////////////////////////////\n");
151         //构造方法
152         for(Constructor con:cs){
153             sb.append("\t");
154             sb.append(Modifier.toString(con.getModifiers()) + " ");
155             sb.append(c.getSimpleName()+"(");
156             //形参
157             Class[] parameterTypes = con.getParameterTypes();
158             for(int i=0;i<parameterTypes.length;i++){
159                 Class parameterType = parameterTypes[i];
160                 if(i==parameterTypes.length-1){
161                     sb.append(parameterType.getSimpleName());
162                 }else{
163                     sb.append(parameterType.getSimpleName()+",");
164                 }
165
166             }
167             sb.append("){}\n");
168         }
169         sb.append("///////////////////////////////////////////////////////////////////////////////////////////////////////\n");
170         //sb.append("}");
171
172         //System.out.println(sb);
173         return sb.toString();
174     }
175
176     /**
177      * 通过反射机制获取String类的父类和父接口
178      * @param c
179      * @return
180      */
181     public String getSuperClass(Class c)
182     {
183         StringBuffer sb = new StringBuffer();
184         //获取父类
185         Class superClass = c.getSuperclass();
186
187         //System.out.println(superClass.getName());
188
189         sb.append("superClass: "+superClass.getName()+"\n");
190         //获取父接口
191         Class[] ins = c.getInterfaces();
192         sb.append("Interfaces: \n");
193         for(Class in:ins){
194             //System.out.println(in.getName());
195             sb.append(in.getName()+"\n");
196         }
197         return sb.toString();
198     }
199
200
201     /**
202      * 获取设置某个特定的属性
203      * @param c
204      * @return
205      * @throws Exception
206      */
207     public String getFiled(Class c) throws Exception
208     {
209         //获取id属性
210         Field idF = c.getDeclaredField("hash");
211
212         //获取到某个特定的属性可以用来?set , get
213         Object o = c.newInstance();
214
215         //打破封装
216         idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。
217
218         //给o对象的id属性赋值"110"
219         idF.set(o, 10); //set
220
221         //get
222         //System.out.println("hash = "+idF.get(o));
223         return "hash = "+ idF.get(o)+"\n";
224     }
225
226     /**
227      * 获取并执行某个特定的构造方法
228      * @param c
229      * @return
230      * @throws Exception
231      */
232
233     public String getMethod(Class c) throws Exception
234     {
235         //获取特定的构造方法
236         Constructor con = c.getDeclaredConstructor(String.class);
237
238         //3.创建对象
239         Object o = con.newInstance("this is a test");
240
241         //System.out.println(o);
242         return o.toString();
243     }
244
245
246 }

2.通过读取配置文件的方式可以降低程序的耦合度,同时通过反射机制和读取配置文件的方式,程序在运行时才加载,这样也在一方面说来减轻了程序的负担。

classInfo.properties

1 className=java.lang.String
2 #you need input the whole name of class
3 #className=User

3.反编译输出到文件的结果为:

classInfo.txt

  1 public final class String{
  2 ///////////////////////////////////////the Fileds of Class/////////////////////////////////////////////
  3     private final char[] value;
  4     private final int offset;
  5     private final int count;
  6     private int hash;
  7     private static final long serialVersionUID;
  8     private static final ObjectStreamField[] serialPersistentFields;
  9     public static final Comparator CASE_INSENSITIVE_ORDER;
 10 ///////////////////////////////////////////////////////////////////////////////////////////////////////
 11 ///////////////////////////////////////the Constructors of Class/////////////////////////////////////////////
 12     public String(byte[],int,int){}
 13     public String(byte[],Charset){}
 14     public String(byte[],String){}
 15     public String(byte[],int,int,Charset){}
 16     public String(byte[],int,int,String){}
 17      String(int,int,char[]){}
 18     public String(StringBuilder){}
 19     public String(StringBuffer){}
 20     public String(byte[]){}
 21     public String(int[],int,int){}
 22     public String(){}
 23     public String(char[]){}
 24     public String(String){}
 25     public String(char[],int,int){}
 26     public String(byte[],int){}
 27     public String(byte[],int,int,int){}
 28 ///////////////////////////////////////////////////////////////////////////////////////////////////////
 29 ///////////////////////////////////////the Methods of Class/////////////////////////////////////////////
 30     public boolean equals(Object){}
 31     public String toString(){}
 32     public int hashCode(){}
 33     public volatile int compareTo(Object){}
 34     public int compareTo(String){}
 35     static int indexOf(char[],int,int,char[],int,int,int){}
 36     public int indexOf(String){}
 37     public int indexOf(int,int){}
 38     public int indexOf(int){}
 39     public int indexOf(String,int){}
 40     public static String valueOf(char){}
 41     public static String valueOf(boolean){}
 42     public static String valueOf(float){}
 43     public static String valueOf(long){}
 44     public static String valueOf(Object){}
 45     public static String valueOf(char[]){}
 46     public static String valueOf(int){}
 47     public static String valueOf(char[],int,int){}
 48     public static String valueOf(double){}
 49     public String[] split(String,int){}
 50     public String[] split(String){}
 51     public boolean startsWith(String){}
 52     public boolean startsWith(String,int){}
 53     public CharSequence subSequence(int,int){}
 54     public String substring(int){}
 55     public String substring(int,int){}
 56     public char[] toCharArray(){}
 57     public String toLowerCase(){}
 58     public String toLowerCase(Locale){}
 59     public String toUpperCase(Locale){}
 60     public String toUpperCase(){}
 61     public String trim(){}
 62     public int codePointBefore(int){}
 63     public int codePointCount(int,int){}
 64     public int compareToIgnoreCase(String){}
 65     public boolean contentEquals(StringBuffer){}
 66     public boolean contentEquals(CharSequence){}
 67     public boolean equalsIgnoreCase(String){}
 68     private int indexOfSupplementary(int,int){}
 69     private int lastIndexOfSupplementary(int,int){}
 70     public int offsetByCodePoints(int,int){}
 71     public boolean regionMatches(int,String,int,int){}
 72     public boolean regionMatches(boolean,int,String,int,int){}
 73     public char charAt(int){}
 74     private static void checkBounds(byte[],int,int){}
 75     public int codePointAt(int){}
 76     public String concat(String){}
 77     public boolean contains(CharSequence){}
 78     public static String copyValueOf(char[],int,int){}
 79     public static String copyValueOf(char[]){}
 80     public boolean endsWith(String){}
 81     public static transient String format(String,Object[]){}
 82     public static transient String format(Locale,String,Object[]){}
 83     public byte[] getBytes(Charset){}
 84     public byte[] getBytes(){}
 85     public void getBytes(int,int,byte[],int){}
 86     public byte[] getBytes(String){}
 87      void getChars(char[],int){}
 88     public void getChars(int,int,char[],int){}
 89     public native String intern(){}
 90     public boolean isEmpty(){}
 91     public int lastIndexOf(String,int){}
 92     public int lastIndexOf(String){}
 93     public int lastIndexOf(int,int){}
 94     public int lastIndexOf(int){}
 95     static int lastIndexOf(char[],int,int,char[],int,int,int){}
 96     public int length(){}
 97     public boolean matches(String){}
 98     public String replace(CharSequence,CharSequence){}
 99     public String replace(char,char){}
100     public String replaceAll(String,String){}
101     public String replaceFirst(String,String){}
102 ///////////////////////////////////////////////////////////////////////////////////////////////////////
103 }
104 superClass: java.lang.Object
105 Interfaces:
106 java.io.Serializable
107 java.lang.Comparable
108 java.lang.CharSequence
109 hash = 10
110 this is a test

而还有可以利用Java反射技术将查询结果封装为对象,这在数据库查询方便提供了广大的便利,后续再补充,谢谢。

时间: 2024-10-10 07:23:41

java反射机制例子,反编译,以及通过读取配置文件降低耦合的相关文章

java 反射机制:运行时的类信息(为框架服务的Bug存在)

反射机制:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 换一种引出反射的说法是:当通过反射与一个未知的类型的对象打交道是,JVM只是简单地检查这个类,看它是属于哪个特定的类(就想RTTI那样).在用它做其他事情之前必须先加载那个类的Class对象.因此,那个类的.class文件对于JVM来说必须是可获取的:那么在本地机器上,要么通过网络获得

JAVA反射机制—学习总结

最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象. 什么是反射机制? "JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制."我们通过一些例子,更好理解反射机制.Class类 我们知道Java是一门面向对象

探索Java反射机制

Java反射机制,可以说我们平常开发中用的很多,尽管作为开发人员,我们并没有什么感觉,那是因为框架的设计者,已经为我们封装好了,我们只需要用去调用一下就可以了.以前也用到过反射,包括自己也写过,也学到过,但是我感觉都比较浅,今天有时间,我觉得有必要去慢慢的深入了解一下. 我们把能够分析类能力的程序称为反射(reflective).反射机制功能及其强大,简单说几个反射的用途: 1.在运行中分析类的能力: 2.在运行中查看对象,例如编写一个通用的tostring方法: 3.实现通用的数组操作代码:

Java 反射机制及Annotation

转自:http://justjavac.iteye.com/blog/714654 Java 反射是 Java 语言的一个很重要的特征. 它允许运行中的 Java 程序对自身进行检查,并能直接操作程序的内部属性.例如,使用 它能获得 Java 类中各成员的名称并显示出来. Java 反射机制主要提供了以下功能: a .在运行时判断任意一个对象所属的类. b .在运行时构造任意一个类的对象. c .在运行时判断任意一个类所具有的成员变量和方法. d .在运行时调用任意一个对象的方法. 在 JDK 

【java基础】Java反射机制

一.预先需要掌握的知识(java虚拟机)  1)java虚拟机的方法区:  java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区.方法区的主要作用是存储被装载的类 的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class 中的类型信息,将这些信息存储到方法区中.这些信息主要包括: 这个类型的全限定名 这个类型的直接超类的全限定名 这个类型是类类型还是接口类型

java反射机制浅谈

一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦! 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射

Java反射机制深入研究

ava 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的方

java反射机制(转)

一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制         有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,     Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成     驱动对象实例

Java反射机制1

一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制         有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码,     Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成     驱动对象实例