2019独角兽企业重金招聘Python工程师标准>>>

  • Reflect反射

Bean:Person类

package com.heima.bean;public class Person {private String name;private int age;public Person() {super();}public Person(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (this.getClass() != obj.getClass())      //判断调用对象和传入对象的字节码文件是否是同一个字节码文件return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}public void eat() {System.out.println("今天吃了一顿金钱豹");}public void eat(int num) {System.out.println("今天吃了" + num + "顿金钱豹");}
}

Reflect 1

package com.heima.reflect;import com.heima.bean.Person;public class Demo1_Reflect {/*** @param args* @throws ClassNotFoundException */public static void main(String[] args) throws ClassNotFoundException {Class clazz1 = Class.forName("com.heima.bean.Person");Class clazz2 = Person.class;Person p = new Person();Class clazz3 = p.getClass();System.out.println(clazz1 == clazz2);System.out.println(clazz2 == clazz3);}}

Reflect 2

package com.heima.reflect;import java.io.BufferedReader;
import java.io.FileReader;public class Demo2_Reflect {/*** * 榨汁机(Juicer)榨汁的案例* 分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze)* @throws IOException */public static void main(String[] args) throws Exception {Juicer j = new Juicer();                                  //创建榨汁机//j.run(new Apple());//j.run(new Orange());BufferedReader br = new BufferedReader(new FileReader("config.properties"));Class clazz = Class.forName(br.readLine());                   //获取该类的字节码文件Fruit f = (Fruit) clazz.newInstance();                     //创建实例对象j.run(f);}
}
interface Fruit {public void squeeze();
}
class Apple implements Fruit {public void squeeze() {System.out.println("榨出一杯苹果汁儿");}
}class Orange implements Fruit {public void squeeze() {System.out.println("榨出一杯橘子汁儿");}
}class Juicer {/*public void run(Apple a) {a.squeeze();}public void run(Orange o) {o.squeeze();}*/public void run(Fruit f) {f.squeeze();}
}

Constructor

package com.heima.reflect;import java.lang.reflect.Constructor;import com.heima.bean.Person;public class Demo3_Constructor {/*** Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数,* 就不能这样创建了,可以调用Class类的getConstructor* (String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance* ("张三",20)方法创建对象* @throws Exception */public static void main(String[] args) throws Exception {Class clazz = Class.forName("com.heima.bean.Person");//Person p = (Person) clazz.newInstance();              通过无餐构造创建对象//System.out.println(p);Constructor c = clazz.getConstructor(String.class,int.class);    //获取有参构造Person p = (Person) c.newInstance("张三",23);                      //通过有参构造创建对象System.out.println(p);}}

Field

package com.heima.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;import com.heima.bean.Person;public class Demo4_Field {/*** Class.getField(String)方法可以获取类中的指定字段(可见的),* 如果是私有的可以用getDeclaedField("name")方法获取,通过set(obj, "李四")方法可以设置指定对象上该字段的值,* 如果是私有的需要先调用setAccessible(true)设置访问权限,用获取的指定的字段调用get(obj)可以获取指定对象中该字段的值* @throws Exception */public static void main(String[] args) throws Exception {Class clazz = Class.forName("com.heima.bean.Person");Constructor c = clazz.getConstructor(String.class,int.class);  //获取有参构造Person p = (Person) c.newInstance("张三",23);                      //通过有参构造创建对象//Field f = clazz.getField("name");                              //获取姓名字段//f.set(p, "李四");                                             //修改姓名的值Field f = clazz.getDeclaredField("name");                        //暴力反射获取字段f.setAccessible(true);                                            //去除私有权限f.set(p, "李四");   System.out.println(p);}}

Method

package com.heima.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Method;import com.heima.bean.Person;public class Demo5_Method {/*** Class.getMethod(String, Class...) 和 Class.getDeclaredMethod(String,* Class...)方法可以获取类中的指定方法,调用invoke(Object,* Object...)可以调用该方法,Class.getMethod("eat") invoke(obj)* Class.getMethod("eat",int.class) invoke(obj,10)* @throws Exception */public static void main(String[] args) throws Exception {Class clazz = Class.forName("com.heima.bean.Person");Constructor c = clazz.getConstructor(String.class,int.class);  //获取有参构造Person p = (Person) c.newInstance("张三",23);                      //通过有参构造创建对象Method m = clazz.getMethod("eat");                               //获取eat方法m.invoke(p);Method m2 = clazz.getMethod("eat", int.class);                  //获取有参的eat方法m2.invoke(p, 10);}}
  • 动态代理

Student

package com.heima.动态代理;public interface Student {public void login();public void submit();
}

StudentImpl

package com.heima.动态代理;public class StudentImp implements Student {@Overridepublic void login() {System.out.println("登录");}@Overridepublic void submit() {System.out.println("提交");}}

User

package com.heima.动态代理;public interface User {public void add();public void delete();
}

UserImpl

package com.heima.动态代理;public class UserImp implements User {@Overridepublic void add() {//System.out.println("权限校验");System.out.println("添加功能");//System.out.println("日志记录");}@Overridepublic void delete() {//System.out.println("权限校验");System.out.println("删除功能");//System.out.println("日志记录");}}

动态代理

package com.heima.动态代理;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {private Object target;public MyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("权限校验");method.invoke(target, args);                    //执行被代理target对象的方法System.out.println("日志记录");return null;}}

Test

package com.heima.动态代理;import java.lang.reflect.Proxy;public class Test {/*** @param args*/public static void main(String[] args) {/*UserImp ui = new UserImp();ui.add();ui.delete();System.out.println("-------------------------------");*//** public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,* InvocationHandler h)*//*MyInvocationHandler m = new MyInvocationHandler(ui);User u = (User)Proxy.newProxyInstance(ui.getClass().getClassLoader(), ui.getClass().getInterfaces(), m);u.add();u.delete();*/StudentImp si = new StudentImp();si.login();si.submit();System.out.println("-------------------------------");MyInvocationHandler m = new MyInvocationHandler(si);Student s = (Student)Proxy.newProxyInstance(si.getClass().getClassLoader(), si.getClass().getInterfaces(), m);s.login();s.submit();}}
  • Enum:枚举

Enum

package com.heima.枚举;public class Demo1_Enum {/*** @param args*/public static void main(String[] args) {//demo1();//demo2();Week3 mon = Week3.MON;mon.show();}public static void demo2() {Week2 mon = Week2.MON;System.out.println(mon.getName());}public static void demo1() {Week mon = Week.MON;Week tue = Week.TUE;Week wed = Week.WED;System.out.println(mon);}}

Week

package com.heima.枚举;public class Week {public static final Week MON = new Week();public static final Week TUE = new Week();public static final Week WED = new Week();private Week(){}                      //私有构造,不让其他类创建本类对象
}

Week2

package com.heima.枚举;public class Week2 {public static final Week2 MON = new Week2("星期一");public static final Week2 TUE = new Week2("星期二");public static final Week2 WED = new Week2("星期三");private String name;private Week2(String name){this.name = name;}                      //私有构造,不让其他类创建本类对象public String getName() {return name;}}

Week3

package com.heima.枚举;public abstract class Week3 {public static final Week3 MON = new Week3("星期一") {public void show() {System.out.println("星期一");}};public static final Week3 TUE = new Week3("星期二"){public void show() {System.out.println("星期二");}};public static final Week3 WED = new Week3("星期三"){public void show() {System.out.println("星期三");}};private String name;private Week3(String name){this.name = name;}                        //私有构造,不让其他类创建本类对象public String getName() {return name;}public abstract void show();
}
  • Enum 2

Enum

package com.heima.枚举2;public class Demo1_Enum {/*** @param args*/public static void main(String[] args) {//demo1();//demo2();//demo3();Week3 mon = Week3.TUE;switch (mon) {case MON:System.out.println("星期一");break;case TUE:System.out.println("星期二");break;}}public static void demo3() {Week3 mon = Week3.MON;mon.show();}public static void demo2() {Week2 mon = Week2.MON;System.out.println(mon.getName());}public static void demo1() {Week mon = Week.MON;System.out.println(mon);}}

enum2

package com.heima.枚举2;public class Demo2_Enum {/*** int ordinal()* int compareTo(E o)* String name()* String toString()* <T> T valueOf(Class<T> type,String name)* values() * 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便*/public static void main(String[] args) {//demo1();
//      Week2 mon = Week2.valueOf(Week2.class, "MON");       //通过字节码对象获取枚举项
//      System.out.println(mon);Week2[] arr = Week2.values();for (Week2 week2 : arr) {System.out.println(week2);}}public static void demo1() {Week2 mon = Week2.MON;Week2 tue = Week2.TUE;Week2 wed = Week2.WED;/*System.out.println(mon.ordinal());                //枚举项都是有编号的System.out.println(tue.ordinal());System.out.println(wed.ordinal());System.out.println(mon.compareTo(tue));          //比较的是编号System.out.println(mon.compareTo(wed));*/System.out.println(mon.name());                //获取实例名称System.out.println(mon.toString());             //调用重写之后的toString方法}}

Week

package com.heima.枚举2;public enum Week {MON,TUE,WED;
}

Week2

package com.heima.枚举2;public enum Week2 {MON("星期一"),TUE("星期二"),WED("星期三");private String name;private Week2(String name) {this.name = name;}public String getName() {return name;}public String toString() {return name;}
}

Week3

package com.heima.枚举2;public enum Week3 {MON("星期一"){public void show() {System.out.println("星期一");}},TUE("星期二"){public void show() {System.out.println("星期二");}},WED("星期三"){public void show() {System.out.println("星期三");}};private String name;private Week3(String name) {this.name = name;}public String getName() {return name;}public abstract void show();}
  • 模板方法设计模式

package com.heima.模版方法设计模式;public class Demo1_Template {/*** @param args*/public static void main(String[] args) {/*long start = System.currentTimeMillis();for(int i = 0; i < 1000000; i++) {System.out.println("x");}long end = System.currentTimeMillis();System.out.println(end - start);*/Demo d = new Demo();System.out.println(d.getTime());}}abstract class GetTime {public final long getTime() {long start = System.currentTimeMillis();code();long end = System.currentTimeMillis();return end - start;}public abstract void code();
}class Demo extends GetTime {@Overridepublic void code() {int i = 0;while(i < 100000) {System.out.println("x");i++;}}
}
  • Test

package com.heima.test;public class DemoClass {public void run() {System.out.println("welcome to heima!");}
}

test1

package com.heima.test;import java.lang.reflect.Method;
import java.util.ArrayList;public class Test1 {/*** @param args* ArrayList<Integer>的一个对象,在这个集合中添加一个字符串数据,如何实现呢?* 泛型只在编译期有效,在运行期会被擦除掉* @throws Exception */public static void main(String[] args) throws Exception {ArrayList<Integer> list = new ArrayList<>();list.add(111);list.add(222);Class clazz = Class.forName("java.util.ArrayList");             //获取字节码对象Method m = clazz.getMethod("add", Object.class);                //获取add方法m.invoke(list, "abc");System.out.println(list);}}

test2

package com.heima.test;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;public class Test2 {/*** * 已知一个类,定义如下: * package cn.itcast.heima;*      public class DemoClass {public void run() {System.out.println("welcome to heima!");}}* (1) 写一个Properties格式的配置文件,配置类的完整名称。 * (2) 写一个程序,读取这个Properties配置文件,获得类的完整名称并加载这个类,用反射的方式运行run方法。* @throws Exception */public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new FileReader("xxx.properties"));    //创建输入流关联xxx.propertiesClass clazz = Class.forName(br.readLine());                                 //读取配置文件中类名,获取字节码对象DemoClass dc = (DemoClass) clazz.newInstance();                             //通过字节码对象创建对象dc.run();}}

test3

package com.heima.test;public class Test3 {/*** * A:案例演示* public void setProperty(Object obj, String propertyName, Object value){},* 此方法可将obj对象中名为propertyName的属性的值设置为value。* @throws Exception */public static void main(String[] args) throws Exception {Student s = new Student("张三", 23);System.out.println(s);Tool t = new Tool();t.setProperty(s, "name", "李四");System.out.println(s);}}class Student {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}}

test4

package com.heima.test;import java.lang.reflect.Field;public class Tool {//此方法可将obj对象中名为propertyName的属性的值设置为value。public void setProperty(Object obj, String propertyName, Object value) throws Exception {Class clazz = obj.getClass();                  //获取字节码对象Field f = clazz.getDeclaredField(propertyName);   //暴力反射获取字段f.setAccessible(true);                            //去除权限f.set(obj, value);}
}
  • JDK7新特性

package com.heima.jdk7;public class Demo1_JDK7 {/*** A:二进制字面量* B:数字字面量可以出现下划线* C:switch 语句可以用字符串* D:泛型简化,菱形泛型* E:异常的多个catch合并,每个异常用或|* F:try-with-resources 语句,1.7版标准的异常处理代码* * 100_000*/public static void main(String[] args) {System.out.println(0b110);System.out.println(100_000);}}

转载于:https://my.oschina.net/u/3668429/blog/1929417

JAVA语言基础-反射、特性相关推荐

  1. Java语言基础-反射机制、正则表达式

    反射机制 反射机制是在运行状态中,对于任意一个类,都能知道这个类(class文件)的所有属性和方法. 对于任意一个对象,都能调用它的任意一个方法和属性. 这种动态获取信息以及动态调用对象的方法的功能称 ...

  2. Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制)

    原文:Java 语言基础(异常机制和File类,IO流,多线程,网络编程,反射机制) 异常机制和File类 异常机制 基本概念 异常就是"不正常"的含义,在 Java 语言中主要指 ...

  3. 1,Java语言基础-Java语言概述和必要计算机知识

    Java语言基础 Java语言概述 1,Java语言发展史 Java语言本质 Java是面向对象的高级语言,它是由c和c++发展而来. Java发展语言历史概述 Java 是由 James Gosli ...

  4. JAVA教程-JAVA语言基础框架知识学习点-JAVA精通必看

    JAVA教程中文版在线代码示例 1. JAVA语言基础 1. 1. 导言( 17 ) 1. 9. 变量( 6 ) 1. 2. Java关键词( 1 ) 1. 10. 变量范围( 2 ) 1. 3. J ...

  5. [JAVA_开课吧资源]第一周 Java语言概述、Java语言基础

    主题一 Java语言概述 » JDK介绍及其基本组件 Sun公司利用Java开发工具箱(Java Development Toolkit ,JDK)发布Java的各个版本.JDK由开发和测试Java程 ...

  6. “面试不败计划”: java语言基础面试题(三)

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 java实 ...

  7. Java语言基础(常见对象3(数组排序(冒泡排序、选择排序、直接插入排序、快速排序、归并排序)、Arrays、基本数据类型包装类、Integer类、自动拆箱、自动装箱))

    Java语言基础 常见对象 数组排序 冒泡排序 相邻元素两两比较,大的往后放,第一次完毕,最大值的元素就会出现在最大索引处:以此循环 //冒泡排序:public static void main(St ...

  8. Java基础知识——Java语言基础

    ---------------------- ASP.Net+Android+IO开发S. .Net培训.期待与您交流! ---------------------- 2.Java语言基础 Java语 ...

  9. 【java后端学习】java语言基础(夯实基础)

    文章目录 一.基础语法 1 java中的标识符 1.1 变量命名规范 1.2 保留字 2 java中的常量 3 java基本数据类型 4 数组 5 字符及字符串 6 运算符 7 控制语句 for语句 ...

  10. Java语言基础(一)

    Java语言基础组成 关键字 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关键字 class interface byte short int lo ...

最新文章

  1. java基础之——类的初始化顺序(转载)
  2. 使用FMDB多线程訪问数据库,及database is locked的问题
  3. jboss将war放在那?_将策略插入JBoss Apiman
  4. 比java好的_Java Spring真的比直接进行Java编程好吗
  5. 美团点评移动网络优化实践
  6. 合并多个nc数据_气象数据处理的火箭加速器—CDO
  7. ORACLE 11GR2 RAC new features 新特性。
  8. Flex 最全的换行 制表符 回车 空格 特殊符号
  9. python发送图片邮件exchangelib_python基于exchange函数发送邮件过程详解
  10. 扇贝python课程免费_扇贝新推出的python课程值得买吗?
  11. 算法与数据结构 第1章 当我们谈论算法的时候,我们在谈论什么?
  12. 开源面向对象数据库 db4o 之旅,第 1 部分: 初识 db4o
  13. 【.NET程序员面试题----初级】第一卷
  14. Origin自动寻峰
  15. uigetfile使用方法
  16. C++多线程1——pthread
  17. React项目实战(一)
  18. 小猫钓鱼游戏java实现
  19. Latex数学公式方程格式总结
  20. linux写日历脚本,shell脚本实现日历的屏幕控制

热门文章

  1. lr函数之lr_eval_string()函数的使用学习
  2. 三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!
  3. XCode下的iOS单元测试(转)
  4. ROS-MikroTik-RouterOS-培训认证各种证书
  5. 使用php+gmail 发送邮件
  6. 整合了一个命令行程序的框架(1)
  7. python多进程程序之间交换数据的两种办法--Queue和Pipe
  8. delphi 读写文本文件
  9. HDU Fibonacci
  10. 数据库事务复制(读写分离)设计的一点经验