java复习笔记7
java的反射机制
平时的编程中并不会用到反射, 但是在编写框架的时候,反射用的就多了,比如你要使用某一个类进行操作,但是这个类是用户通过配置文件配置进来的,你需要先读配置文件,然后拿到这个类的全类名:比如com.xx.Person,然后在利用反射API来做操作, 反射能让程序更加灵活;
可以利用三种方式,获取Class的实例, 第一种方式: Class.forName是用的是最多的:
运行下面代码
package org.nono.getClassName; class X{ public String name = "nono"; } public class getClassDemo { public static void main(String args[]) { Class<?> c = null; Class<?> c1 = null; Class<?> c2 = null; X x = new X(); try{ c = Class.forName("org.nono.getClassName.X"); }catch(Exception e) { e.printStackTrace(); } c1 = X.class; c2 = x.getClass(); System.out.println(c); System.out.println(c1); System.out.println(c2); } }
利用反射实现的实例化对象, 使用反射实例化对象时候, 最好必须存在一个无参的构造方法, 否则使用class.newInstance();会报错;
运行下面代码
class Demo { public String name = ""; public void setName (String name) { this.name = name; } } public class InstanceDemo { public static void main(String args[]) { Class<?> c = null; try{ c = Class.forName("Demo"); Demo demo = (Demo)c.newInstance(); demo.setName("hehe"); System.out.println(demo.name); }catch(Exception e) { e.printStackTrace(); } } }
如果在实际开发中必须使用有参构造的方式实例化对象, 必须引用java.lang.reflect.Constructor类:
运行下面代码
import java.lang.reflect.*; class Demo { public String name = ""; public Demo(String name) { this.name = name; } public void setName (String name) { this.name = name; } } public class InstanceDemo { public static void main(String args[]) { Class<?> c = null; try{ c = Class.forName("Demo"); Constructor ct[] = null; ct = c.getConstructors(); Demo demo = (Demo)ct[0].newInstance("hehe"); System.out.println(demo.name); }catch(Exception e) { e.printStackTrace(); } } }
java的反射让java更加灵活了,利用反射, 只要知道构造函数的名字,就能直接实例化方法, 能够优化代码:
运行下面代码
interface Fruit{ public String name=""; } abstract class FruitName implements Fruit{ public String name=""; public String getName() { return this.name; } } class Apple extends FruitName { public String name = "apple"; } class Pear extends FruitName { public String name = "pear"; } public class FactoryDemo{ public static void main(String args[]) { Class<?> c = null; Class<?> c1 = null; try{ c = Class.forName("Apple"); c1 = Class.forName("Pear"); System.out.println(c.newInstance()); System.out.println(c1.newInstance()); }catch(Exception e) { e.printStackTrace(); } } }
常用的3个annotation
java的annotation
运行下面代码
import java.util.*; class Demo{ public void print() { System.out.println("DemoGet"); } } class SuperDemo<T> extends Demo{ private T t = null; @Override public void print() { System.out.println("SuperDemoGet"); } @Deprecated public void show() { System.out.println("Supershow"); } public T get() { return t; } public void set(T t) { this.t = t; } } public class AnnotationDemo { @SuppressWarnings({"unchecked"/*,"override"*/,"deprecation"}) public static void main(String args[]) { SuperDemo sd = new SuperDemo(); sd.show(); HashMap hm = new HashMap(); } }
@Override的RetentionPolicy作用范围是SOURCE, 只能在源程序中出现;
@Deprecated的作用范围是在RUNTIME中, 在执行的时候也出现;
@SuppressWarning的作用范围是SOURCE;
自定义Annotation
先写一个主方法:
运行下面代码
@myAnno(name="hehe") @myAnno1(arr={"1","2"}) public class AnnoDemo { public static void main(String args[]) { } }
自定义的Annotation @myAnno
运行下面代码
import java.lang.annotation.*; @Retention(value=RetentionPolicy.RUNTIME) public @interface myAnno { public String name(); }
自定义的Annotation @myAnno1
运行下面代码
import java.lang.annotation.*; @Retention(value=RetentionPolicy.RUNTIME) public @interface myAnno1 { public String[] arr(); }
本文作者:方方和圆圆
本文链接:https://www.cnblogs.com/diligenceday/p/5237845.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2014-03-04 2014为止移动端的手机屏幕尺寸缩略图
2014-03-04 bugzilla_firefox