一.Class类
1.class类的简介
在面向对象中,万事万物皆对象!其实在JAVA语言中,有两样东西不是面向对象的,一个是普通的数据类型(int a=5),它用封装类(包装类)来弥补了!另外一个是静态的成员变量,他是一个类!可是类也是对象,所以一般在JAVA中认为万事万物皆对象!
那么又有一个问题了!类的对象又是什么呢?
类是java.lang.Class的实例对象!
这又产生了一个问题了,这个Class类又如何表示呢?这就引出了下面这个标题,class类的使用!
2.class类的使用
package com.liangdianshui; public class UseClass { public static void main(String[] args) { /** * 问题1.MyClass的实例对象如何表示呢? * 直接new出来就能表示了 */ MyClass myclass=new MyClass(); /** * MyClass这个类也是一个实例对象,它是java.lang.Class类的实例对象 * 问题2.那么,java.lang.Class类的实例对象又是如何表示的呢? * 任何一个类都是java.lang.Class类的实例对象,这个实例对象有三种表示的方式 */ //第一种表示方式(这也告诉我们任何一个类都有一个隐含的静态成员变量) Class c1=MyClass.class; //知道类名的时候使用 //第二种表示方式:通过getClass方法获取 Class c2=myclass.getClass(); //知道类对象的时候使用 //第三种表示的方式: Class c3=null; try { c3=Class.forName("com.liangdianshui.MyClass"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(c1==c2); System.out.println(c2==c3); /** * 上面的c1,c2和c3我们可以称之为类类型(class type) * 因此我们也可以得知:我们可以通过类的类类型来创建该类的对象实例! * 也就是说:我们可以通过c1,c2和c3来创建MyClass类的实例对象! */ try { MyClass myclass2 = (MyClass) c1.newInstance(); //前提是MyClass类要有无参数的构造函数(构造方法) } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } // 创建一个类 class MyClass { public MyClass(){ System.out.println("liangdianshui"); } }运行结果:
liangdianshui true true liangdianshui
3.动态加载类
上面提到的表示Class类的三种实例方法的其中一种是Class.forName("类的名称"),其实这种方法不仅表示了类的类类型(也就是表示Class类的实例对象)还代表了动态的加载类!然而JAVA在编译的时候是加载静态加载类的,运行的时刻是加载动态加载类的!
实例:
package com.liangdianshui; public class Office { public static void main(String[] args) { try { // 动态加载类,在运行的时候才加载(功能性的类一般使用动态加载类) Class c = Class.forName(args[0]); OfficeAble officeAble = (OfficeAble) c.newInstance(); officeAble.start(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
创建一个接口封装公共的方法!
package com.liangdianshui; interface OfficeAble { public void start(); }具体的实例来实现接口!
package com.liangdianshui; public class World implements OfficeAble{ @Override public void start() { // TODO Auto-generated method stub System.out.println("World"); } }
package com.liangdianshui; public class Excel implements OfficeAble { @Override public void start() { // TODO Auto-generated method stub System.out.println("Excel"); } }
4.类类型
基本的数据类型是类类型,void等关键字也是类类型
证明上面结论的demo:
package com.liangdianshui; public class ClassType { public static void main(String[] args) { Class classInt=int.class; //int类的类类型 Class classString=String.class; //String类的类类型 Class classDouble=double.class; Class classVoid=void.class; //void关键字的类类型 System.out.println(classInt.getName()); //获取类名 System.out.println(classString.getName()); //获取类名 System.out.println(classString.getSimpleName()); //获取不包含包名的类名(单一类名) System.out.println(classVoid.getName()); } }运行的结果:
int java.lang.String String void
二.方法的反射,成员变量的反射,构造函数的反射
1.通过反射获取类的信息
package com.liangdianshui.reflect.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.TypeVariable; public class ClassUtil { static StringBuilder sb = null; /** * 获取类的名称 * * @param obj * 该对象所属类的信息 * @return 类名 */ public static String getClassMsg(Object obj) { sb = new StringBuilder(); Class c = obj.getClass();// c是obj类的类类型 sb.append(c.getName()); // 获取类名 return sb.toString(); } /** * 获取该类中所有public函数的信息 * Methods类,是方法的对象,一个成员方法就是一个Method对象 * 1.getMethod():获取该类中所有的public的函数,包括父类继承而来的函数 * 2.getDeclaredMethods():获取的是该类自己声明的方法 * @param obj 该对象所属类的信息 * @return String 方法类型+" "+方法名+"("+"参数名"+")" */ public static String getMethods(Object obj) { sb = new StringBuilder(); Class c = obj.getClass(); Method[] methods = c.getMethods(); // 过去该类中的所有public函数 for (Method method : methods) { Class returnType = method.getReturnType(); // 获取方法的返回类型 sb.append(returnType.getName()); sb.append(" "); sb.append(method.getName() + "("); Class[] parameterTypes = method.getParameterTypes(); if (parameterTypes.length == 0) { sb.append(")"); sb.append("\n"); continue; } for (int i = 0; i < parameterTypes.length; i++) { sb.append(parameterTypes[i].getName()); if (i == parameterTypes.length - 1) { sb.append(")"); continue; } sb.append(","); } sb.append("\n"); } return sb.toString(); } /** * 获取该类成员变量的信息 * 1.成员变量也是对象,它是java.lang.reflect.Field的对象,Filed类封装了关于成员变量的信息 * 2.getFields():获取所有public的成员变量的信息 * 3.getDeclaredFields():获取该类自己声明的成员变量的信息 * @param obj 该对象所属类 * @return */ public static String getFiled(Object obj) { sb = new StringBuilder(); Class c = obj.getClass(); Field[] fields = c.getDeclaredFields(); for (Field field : fields) { sb.append(field.getName()); sb.append("\n"); } return sb.toString(); } /** * 获取构造函数的信息 * 1.getConstructors():获取所有public构造函数的信息 * 2.getDeclaredConstructors():获取自定义的构造函数的信息 * @param obj * @return */ public static String getConstructor(Object obj) { sb = new StringBuilder(); Class c = obj.getClass(); Constructor[] constructors = c.getDeclaredConstructors(); for (Constructor Constructor : constructors) { sb.append(Constructor.getName()); sb.append("("); Class[] typeParameters = Constructor.getParameterTypes(); if (0 == typeParameters.length) { sb.append(")"); sb.append("\n"); continue; } for (int i = 0; i < typeParameters.length; i++) { sb.append(typeParameters[i].getName()); if (i == typeParameters.length - 1) { sb.append(")"); continue; } sb.append(","); } sb.append("\n"); } return sb.toString(); } }
package com.liangdianshui; import com.liangdianshui.reflect.util.ClassUtil; public class PrintMsg { public static void main(String[] args) { String str = "Hello"; System.out.println("str的类名为:" + ClassUtil.getClassMsg(str)); System.out.println("str的类中的所有public函数:\n" + ClassUtil.getMethods(str)); System.out.println("str类中自定义成员变量的信息:\n"+ClassUtil.getFiled(str)); System.out.println("str类中自定义的构造函数:\n"+ClassUtil.getConstructor(str)); } }运行结果:
str的类名为:java.lang.String str的类中的所有public函数: boolean equals(java.lang.Object) java.lang.String toString() int hashCode() int compareTo(java.lang.Object) int compareTo(java.lang.String) int indexOf(java.lang.String,int) int indexOf(int) int indexOf(int,int) int indexOf(java.lang.String) java.lang.String valueOf(float) java.lang.String valueOf(double) java.lang.String valueOf(boolean) java.lang.String valueOf([C,int,int) java.lang.String valueOf([C) java.lang.String valueOf(java.lang.Object) java.lang.String valueOf(char) java.lang.String valueOf(int) java.lang.String valueOf(long) char charAt(int) int codePointAt(int) int codePointBefore(int) int codePointCount(int,int) int compareToIgnoreCase(java.lang.String) java.lang.String concat(java.lang.String) boolean contains(java.lang.CharSequence) boolean contentEquals(java.lang.StringBuffer) boolean contentEquals(java.lang.CharSequence) java.lang.String copyValueOf([C,int,int) java.lang.String copyValueOf([C) boolean endsWith(java.lang.String) boolean equalsIgnoreCase(java.lang.String) java.lang.String format(java.util.Locale,java.lang.String,[Ljava.lang.Object;) java.lang.String format(java.lang.String,[Ljava.lang.Object;) [B getBytes() [B getBytes(java.lang.String) void getBytes(int,int,[B,int) [B getBytes(java.nio.charset.Charset) void getChars(int,int,[C,int) java.lang.String intern() boolean isEmpty() int lastIndexOf(int) int lastIndexOf(int,int) int lastIndexOf(java.lang.String,int) int lastIndexOf(java.lang.String) int length() boolean matches(java.lang.String) int offsetByCodePoints(int,int) boolean regionMatches(int,java.lang.String,int,int) boolean regionMatches(boolean,int,java.lang.String,int,int) java.lang.String replace(char,char) java.lang.String replace(java.lang.CharSequence,java.lang.CharSequence) java.lang.String replaceAll(java.lang.String,java.lang.String) java.lang.String replaceFirst(java.lang.String,java.lang.String) [Ljava.lang.String; split(java.lang.String) [Ljava.lang.String; split(java.lang.String,int) boolean startsWith(java.lang.String) boolean startsWith(java.lang.String,int) java.lang.CharSequence subSequence(int,int) java.lang.String substring(int,int) java.lang.String substring(int) [C toCharArray() java.lang.String toLowerCase() java.lang.String toLowerCase(java.util.Locale) java.lang.String toUpperCase(java.util.Locale) java.lang.String toUpperCase() java.lang.String trim() void wait(long,int) void wait(long) void wait() java.lang.Class getClass() void notify() void notifyAll() str类中自定义成员变量的信息: value hash serialVersionUID serialPersistentFields CASE_INSENSITIVE_ORDER HASHING_SEED hash32 str类中自定义的构造函数: java.lang.String([B) java.lang.String([B,int,int) java.lang.String([B,java.nio.charset.Charset) java.lang.String([B,java.lang.String) java.lang.String([B,int,int,java.nio.charset.Charset) java.lang.String(int,int,[C) java.lang.String([C,boolean) java.lang.String(java.lang.StringBuilder) java.lang.String(java.lang.StringBuffer) java.lang.String([I,int,int) java.lang.String([C,int,int) java.lang.String([C) java.lang.String(java.lang.String) java.lang.String() java.lang.String([B,int,int,java.lang.String) java.lang.String([B,int) java.lang.String([B,int,int,int)
2.方法的反射操作
(1)通过上面获取类的信息可以获取某个类中的某个方法的信息,所以我们可以通过method.invoke()来实现方法的反射操作,在这之前,我们需要获取这个方法!
(2)1.要获取一个方法先要获取类的信息
2.通过getMethod()获取方法(会抛异常,避免此方法不存在)
3.method.invoke()来实现方法的反射操作
实例:
先创建一个类
package com.liangdianshui; public class PrintfA { public void printfA(int a, int b) { System.out.println(a + b); } public void printfA(String a, String b) { System.out.println(a + b); } }然后通过类名获取PrintfA的类类型,并实例化!然后获取printfA的方法,通过invoke()来实现方法的反射操作
package com.liangdianshui; import java.lang.reflect.Method; public class MethodReflect { public static void main(String[] args) { Class c = PrintfA.class; PrintfA printfA; try { printfA = (PrintfA) c.newInstance(); Method method = c.getMethod("printfA", int.class, int.class); method.invoke(printfA, 10, 11); } catch (Exception e) { e.printStackTrace(); } } }
Demo:http://download.csdn.net/detail/two_water/9449782