10.一文了解JAVA反射超详尽知乎

title:Day12-反射机制date:2020-07-1818:37:30tags: 反射机制Java反射机制就是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;对于这种动态获取的信息以及动态调用对象的方法和功能称为Java语言的反射机制。 简述:动态获取类中的信息,就是Java反射 反射机制实现要想对字节码文件进行解剖,必须要有字节码文件对象 获取字节码对象的方式一: Object类中的getClass方法: 必须明确类名,并创建对象 Personp=newPerson();Classclazz=() 获取字节码对象的方式二: 任何数据类型都具备一个静态的属性.class来获取Class对象: 必须明确类名 Classclazz=获取字节码对象的方式三: 通过forName()方法实现: 必须明确类名 StringclassName="";Classclazz=(className) publicstaticvoidmain(Stringargs[]){com.zimo.Personp=newcom.zimo.Person();StringclassName="";Classclazz=Class.forName(className);clazz.newInstance();--------------------------------------------------------------------------------------------com.zimo.Personp=newcom.zimo.Person("zimo",18);StringclassName="";Classclazz=Class.forName(className);Constructorc=clazz.getConstructor(String.class,int.class);Objectobj=c.newInstance("zimo",18);--------------------------------------------------------------------------------------------Classclazz=Class.forName("");Filedfiled=clazz.getFiled("age");filed=clazz.getDeclaredFiled("age");filed.setAccessible(true);Objecto=clazz.newInstance();filed.set(o,86);Objectobj=filed.get(o);--------------------------------------------------------------------------------------------Classclazz=Class.forName("");Method[]me=clazz.getMethods();Method[]me1=clazz.getDeclaredMethods();Methodme2=clazz.getMethod("show",null);Methodme3=clazz.getMethod("show1",String.class,int.class);Objectobj=clazz.newInstance();me2.invoke(obj,null);me3.invoke(obj,"zimo",18);}反射练习packagecom.zimo.ComputerRun;publicclassMainBoard{publicvoidrun(){System.out.println("MainBoardRun...........");}publicvoidusePCI(PCIp){if(p!=null){p.open();p.close();}}}packagecom.zimo.ComputerRun;publicclassReflectTest{publicstaticvoidmain(Stringargs[]){MainBoardmb=newMainBoard();mb.run();FileconfigFile=newFile("");Propertiesprop=newProperties();FileInputStreamfis=newFileInputStream(configFile);prop.load(fis);for(inti=0;i=5&&len<=15){if(!qq.startsWith("0")){try{longl=Long.parseLong(qq);System.out.println(l+":正确");}catch(NumberFormatExceptione){System.out.println(qq+":含有非法字符");}}else{System.out.println(qq+":开头不能为0");}}else{System.out.println(qq+":长度错误");}}publicstaticbooleancheckQQByRegex(Stringqq){Stringregex="[1-9][0-9]{4,14}";booleanb=qq.matches(regex);System.out.println(b);returnb;}publicstaticvoidmain(Stringargs[]){StringQQ="123456";checkQQ(QQ);checkQQByRegex(QQ);}正则表达式对字符串常见操作匹配:其实使用的就是String类中的matches()方法切割:其实使用的就是String类中的split()方法替换:其实使用的就是String类中的replaceAll()方法获取:publicstaticvoidmatchesRegex(){Stringtel="15800001111";Stringregex="1[3578][0-9]{9}";booleanb=tel.matches(regex);System.out.println(tel+":"+b);}publicstaticvoidsqlitRegex(){Stringnames="zimo---zhangsan@@@@lisi######wangwu";String[]names=names.split("(.)\\1+");System.out.println(tel+":"+b);}publicstaticvoidreplaceAllRegex(){Stringstr="";str=str.replaceAll("(.)\\1+","$1");System.out.println(tel+":"+b);Stringtel="15800001111";tel=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");}publicstaticvoidsqlitRegex(){Stringstr="dajiahao,mingtianbufangjia!";Stringregex="\\b[a-z]{3}\\b";Patternp=Pattern.compile(regex);Matcherm=p.matcher(p);while(m.find()){System.out.println(m.group());System.out.println(m.start()+":"+m.end());}}publicstaticvoidmain(Stringargs[]){fun1();}publicstaticvoidfun1(){Stringstr="我我...我我要..要要要要...要要学学学..学学学学编编编编...编编程程程程....程程程程程程程程";str=str.replaceAll("\\.+","");str=str.replaceAll("(.)\\1+","$1");}publicstaticvoidfun2(){Stringip_str="192.168.1.82127.0.0.13.3.3.3105.70.11.55";ip_str=ip_str.replaceAll("(\\d+)","00$1");ip_str=ip_str.replaceAll("0*(\\d{3})","$1");String[]ips=ip_str.split("+");TreeSetts=newTreeSet();for(Stringip:ips){ts.add(ip);}for(Stringip:ts){System.out.println(ip.replaceAll("0*(\\d+)","$1"));}}publicstaticvoidfun3(){Stringmail="abc1@";Stringregex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3}){1,3}";regex="\\w+@\\w+(\\.\\w+)+";booleanb=mail.matches(regex);System.out.println(mail+":"+b);}网页爬虫用于在互联网中获取符合指定规则的数据 publicstaticvoidmain(Stringargs[]){Listlist=getMails();for(Stringl:list){System.out.println(l);}}publicstaticListgetMails(){BufferedReaderbufr=newBufferedReader(newFileReader("D:\\"));Stringmail_regex="\\w+@\\w+(\\.\\w+)+";Listlist=newArrayList();Patternp=Pattern.compile(mail_regex);Stringline=null;while((line=bufr.readLine())!=null){Matcherm=p.matcher(line);while(m.find()){list.add(m.group());}}returnlist;}publicstaticListgetMailsByWeb(){URLurl=newURL(":8080/myweb/");BufferedReaderbufr=newBufferedReader(newInputStreamReader(url.openStream()));Stringmail_regex="\\w+@\\w+(\\.\\w+)+";Listlist=newArrayList();Patternp=Pattern.compile(mail_regex);Stringline=null;while((line=bufr.readLine())!=null){Matcherm=p.matcher(line);while(m.find()){list.add(m.group());}}returnlist;}单元测试框架测试框架的使用 packageSectionTestDemo;importorg.junit.Assert;importorg.junit.Test;publicclassUserServiceTest{@TestpublicvoidtestLogin(){UserServiceuserService=newUserService();Stringrs=userService.login("admin","123456");Assert.assertEquals("err","success",rs);}}packageSectionTestDemo;publicclassUserService{publicStringlogin(Stringname,Stringpass){if("admin".equals(name)&&"1234567".equals(pass)){return"success";}else{return"error";}}}注解说明: @Test:测试方法@Before:测试实例方法之前Junit5:使用的是BeforeEach@After:测试实例方法之后Junit5:使用的是AfterEach@BeforeClass:测试静态方法之前Junit5:使用的是BeforeAll@AfterClass:测试静态方法之后Junit5:使用的是AfterAll注解用在类上,方法上,成员变量,构造器,…上对成分进行编译约束,标记等操作的。注解是的新特性。注解相当一种标记,是类的组成部分,可以给类携带一些额外的信息。注解是给编译器或JVM看的,编译器或JVM可以根据注解来完成对应的功能。注解作用标记。方法重写约束@Override函数式接口约束。@FunctionalInterface.现今最牛逼的框架技术多半都是在使用注解和反射。都是属于框架的基础技术。自定义注解自定义注解格式: 修饰符@interface注解名{ ​注解属性 } 小结: 自定义注解使用@interface关键字注解默认可以标记很多地方packagecom.zimo._01selfNote;@interfaceBook{}@interfaceMyTest{}@BookpublicclassMyBook{@Book@MyTestpublicstaticvoidmain(@MyTestString[]args){@MyTestintage=12;}}注解属性格式: 格式1:数据类型属性名()格式2:数据类型属性名()default默认值属性使用的数据类型: 八种基础数据类型(int,short,long,double,byte,char,boolean,float) String,Class 以上类型都支持 小结: 注解可以有属性,属性名必须带()在用注解的时候,属性必须赋值,除非这个属性有默认值!!packagecom.zimo._01selfNote;@interfaceBook{Stringname();String[]authors();doubleprice();Stringaddress()default"中国-北京";}@Book(name="《精通Java基础》",authors={"zimo","mike"},price=)publicclassMyBook{@Book(name="《SQL从入门到放弃》",authors={"小白","递归"},price=9.99,address="中国-上海")publicstaticvoidmain(String[]args){}}注解的特殊属性名称:valuevalue属性,如果只有一个value属性的情况下,使用value属性的时候可以省略value名称不写!!如果有多个属性,且多个属性没有默认值,那么value是不能省略的packagecom.zimo._02zhujie;@interfaceBook{Stringvalue();}@interfaceBook1{Stringvalue();intage();}@interfaceBook2{Stringvalue();intage()default18;}@Book("")publicclassMyBook{}@Book1(value="",age=12)@Book2("")classMyBook1{}元注解元注解是sun公司提供的,是用在自定义注解上的注解,是用来注解自定义注解的 元注解有两个: @Target:约束自定义注解只能在那些地方使用 但是默认的注解可以在类,方法,构造器,成员变量,…使用 ElementType: TYPE//类、接口、枚举类FIELD//成员变量(包括:枚举常量)METHOD//成员方法PARAMETER//方法参数CONSTRUCTOR//构造方法LOCAL_VARIABLE//局部变量ANNOTATION_TYPE//注解类PACKAGE//可用于修饰:包TYPE_PARAMETER//类型参数,JDK1.8新增TYPE_USE//使用类型的任何地方,JDK1.8新增@Retention:声明注解的生命周期 声明注解的作用范围:编译时,运行时 RetentionPolicy: SOURCE//源文件保留CLASS//编译期保留,默认值RUNTIME//运行期保留,可通过反射去获取注解信息,开发常用注解的解析packagecom.zimo._04_ReNote;importorg.junit.Test;importjava.lang.annotation.*;importjava.lang.reflect.Method;importjava.util.Arrays;@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@interfaceBook{Stringvalue();doubleprice()default100;String[]author();}@Book(value="《Java基础》",price=99.9,author={"zimo","mike"})classBookStore{@Book(value="《MyBatis持久层框架》",price=199.9,author={"zimo","jack"})publicvoidrun(){}}publicclassReNote{@TestpublicvoidparseClass(){Classc=BookStore.class;if(c.isAnnotationPresent(Book.class)){Bookbook=(Book)c.getDeclaredAnnotation(Book.class);System.out.println(book.value()+book.price()+Arrays.toString(book.author()));}Methodrun=c.getDeclaredMethod("run");if(run.isAnnotationPresent(Book.class)){Bookbook=(Book)c.getDeclaredAnnotation(Book.class);System.out.println(book.value()+book.price()+Arrays.toString(book.author()));}}}模拟方法packagecom.zimo._05_MyTest;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;importjava.lang.reflect.Method;@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@interfaceMyTest{}publicclassMyTestDemo{@MyTestpublicvoidtest01(){System.out.println("1111");}publicvoidtest02(){System.out.println("2222");}@MyTestpublicvoidtest03(){System.out.println("3333");}publicstaticvoidmain(String[]args)throwsException{MyTestDemomyTestDemo=newMyTestDemo();Classc=MyTestDemo.class;Method[]methods=c.getDeclaredMethods();for(Methodmethod:methods){if(method.isAnnotationPresent(MyTest.class)){method.invoke(myTestDemo);}}}}动态代理动态代理设计模式(让别人替我们去做某些事) 动态代理只能为实现接口的实现类对象做代理(也可以只为接口做代理对象) 开发步骤:必须有接口实现类要实现接口,定义自己的业务功能代码为业务功能做代理对象(动态代理)小结:动态代理非常灵活,可以被任意的接口实现类对象做代理动态代理可以为被代理对象的所有接口的所有方法做代理,动态代理可以在不改变方法源码的情况下,实现对方法功能的增强动态代理类的字节码(代理对象)在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类动态代理同时也提高了开发效率缺点:只针对接口或者接口的实现类对象做代理对象,普通类是不能做代理对象的 packagecom.zimo._06_ActiveDemo;publicinterfaceUserService{Stringlogin(Stringadmin,Strings);voiddeleteAll();}packagecom.zimo._06_ActiveDemo;publicclassUserServiceImplimplementsUserService{@OverridepublicStringlogin(Stringadmin,Strings){if("admin".equals(admin)&&"123456".equals(s))return"success";return"error";}@OverridepublicvoiddeleteAll(){System.out.println("delsuccess");}}packagecom.zimo._06_ActiveDemo;publicclassTestDemo{publicstaticvoidmain(String[]args){UserServiceuserService=ProxyUtil.getProxy(newUserServiceImpl());Stringres=userService.login("admin","123456");System.out.println(res);userService.deleteAll();}}packagecom.zimo._06_ActiveDemo;importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Method;importjava.lang.reflect.Proxy;publicclassProxyUtil{publicstaticUserServicegetProxy(UserServiceImpluserService){return(UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),userService.getClass().getInterfaces(),newInvocationHandler(){@OverridepublicObjectinvoke(Objecto,Methodmethod,Object[]objects)throwsThrowable{longstartTime=System.currentTimeMillis();Objectre=method.invoke(o,objects);longendTime=System.currentTimeMillis();System.out.println(endTime-startTime);returnre;}});}} ();i++){stringpciname=prop.getproperty("pci"+(i+1));classclazz=class.forname(pciname);pcip=(pci)clazz.newinstance();mb.usepci(p);}}}packagecom.zimo.computerrun;publicinterfacepci{publicvoidopen();publicvoidclose();}##配置声卡pci1=com.zimo.computer.soundcard#配置网卡pci2=com.zimo.computer.netcardpackagecom.zimo.computerrun;publicclasssourcecardimplementspci{publicvoidopen(){system.out.println("soundopen...");}publicvoidclose(){system.out.println("soundclose...");}}packagecom.zimo.computerrun;publicclassnetcard{publicvoidopen(){system.out.println("netcardopen...");}publicvoidclose(){system.out.println("netcardclose...");}}publicclassmybatis{publicstaticvoidsave(objectobj)throwsexception{printstreamps=newprintstream(newfileoutputstream(".>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值