首页 > 编程 > Java > 正文

反射java学习笔记

2019-11-11 00:26:56
字体:
来源:转载
供稿:网友

类的认识

package com.cn.reflect;public class demo {/*** 测试类CLass* @param args*/public static void main(String[] args) {FZS f1=new FZS();System.out.PRintln(f1.getClass());//方式1取得类名Class c1=f1.getClass();System.out.println(c1);//方式二,每个类含有一个隐含的成员变量.class,称为类类型Class c2=FZS.class;System.out.println(c2);//方式三,获取类类型,需要输入全名,会出现异常Class c3=null;try {c3=Class.forName("com.cn.reflect.FZS");System.out.println(c3);} catch (ClassNotFoundException e) {e.printStackTrace();}System.out.println(c1==c2);System.out.println(c1==c3);//可以使用类类型获取类实例try {FZS f2=(FZS) c1.newInstance();f2.print();} catch (InstantiationException | IllegalaccessException e) {e.printStackTrace();}}}class FZS{public void print(){System.out.println("test class ");}}

2.静态加载类

class Office {/**静态加载*/public static void main(String[] args) {/*new 创建对象,静态加载所有可能用到的类*/if("Word".equals(args[0])){Word w=new Word();w.start();}if("Excel".equals(args[0])){Excel e=new Excel();e.start();}}}

class Word {public static void main(String[] args) {}public void start(){System.out.println("静态类加载测试");}}

3.动态加载类

/**动态加载类*/class OfficeBetter {public static void main(String[] args) {try{//动态加载类,在运行时刻加载Class c=Class.forName(args[0]);//通过类类型,创建该类对象OfficeAble oa=(OfficeAble)c.newInstance();oa.start();}catch (Exception e){e.printStackTrace();}}}

/**接口*/interface OfficeAble{public  void start();}

class Word2 implements OfficeAble {public void start(){System.out.println("Word start!!");}}

4.简单封装,获取类信息

package com.cn.reflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;public class ClassUtil {public static void printMethodMessage(Object obj){Class c=obj.getClass();Method[] ms= c.getMethods();for(Method s:ms){System.out.print("方法名是:"+s.getReturnType()+" "+s.getName()+"(");Class[] parameters=s.getParameterTypes();for(Class p:parameters){System.out.print(p.getName()+" ");}System.out.println(");");} }private static void printFieldMethod(Object obj) {Class c=obj.getClass();/*** 成员变量是也是对象* java.lang.reflect.Field* Field类封装了关于成员变量的操作* getField*/Field[] fs=c.getDeclaredFields();for(Field f:fs){//Class fieldType=f.getType();String typeName=fieldType.getName();String typeName2=fieldType.getTypeName();System.out.println(f.getClass()+"--" +f.getName()+" --"+fieldType+"-- "+typeName+" --"+typeName2);}}public static void printConstructorMethod(Object obj){Class c=obj.getClass();/*** 构造函数也是对象* java.lang.Constructor 封装了构造函数的信息* */Constructor[]cons=c.getDeclaredConstructors();for(Constructor con:cons){//获取构造函数名System.out.print(con.getName()+"( ");//获取构造函数参数名列表Class[] paramters=con.getParameterTypes();for (Class class1 : paramters) {System.out.print(class1.getName()+ ",");}System.out.println(");");}}}

package com.cn.reflect;public class demo3 {public static void main(String[] args) {String s="烦烦烦";ClassUtil.printMethodMessage(s);Integer a=1;ClassUtil.printConstructorMethod(a);ClassUtil.printConstructorMethod(1);ClassUtil.printConstructorMethod("a");ClassUtil.printConstructorMethod(1);}}

5.反射及其用法

package com.cn.reflect;

import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 反射测试 * @author fzs * */public class demo5 {public static void main(String[] args) {A a=new A();Class c=a.getClass();/*** 2.获取方法,名称,参数列表* get*/try {//Method m=c.getMethod("print", new Class[]{int.class,int.class})Method m=c.getMethod("print",int.class,int.class);//方法中如果没有返回值返回null,有返回值返回具体的返回值//Object o=m.invoke(a,new Object[]{10,20});Object o=m.invoke(a,10,20);System.out.println("=================================");m=c.getMethod("print",String.class,String.class);o=m.invoke(a, "FENGZHENGSHU","fengzhengyun");System.out.println("=================================");} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}class A{public void print(int a,int b){System.out.println(a+b);}public void print(String a,String b){System.out.println(a.toLowerCase()+","+b.toUpperCase());}}

6.反射解析泛型函数本质

package com.cn.reflect;import java.lang.reflect.Method;import java.util.ArrayList;public class demo6 {public static void main(String[] args) {ArrayList list1=new ArrayList();ArrayList<String> list2=new ArrayList<String>();list2.add("fzs");//list2.add(2);编译前防错Class c1=list1.getClass();Class c2=list2.getClass();System.out.println(list2);System.out.println(c1==c2);/*** 使用反射绕过编译*/try {//Method m=c2.getMethod("add", int.class);Method m=c2.getMethod("add", Object.class);Object obj=m.invoke(list2, 20);System.out.println(list2);} catch (Exception e) {e.printStackTrace();}}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表