java--反射--黑马程序员

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

反射

主要内容:《获取Class对象的三种方式、获取无参_有参构造方法、获取成员变量、获取成员方法、运行配置文件内容、越过泛型检查、代理模式、动态代理、模版设计模式、装饰模式、 JDK5的新特性、JDK7的新特性 》

1.获取Class对象的三种方式

1.Object类中的:getClass():此方法不是静态的,必须对象的引用调用;
2.class属性:任何的数据类型(包括基本数据类型)都有一个静态的class属性,它可以获取这个类的Class对象;
3.Class类中有个静态方法:
 Class forName(String className);className要是全名限定的类名(带包名的类名)
 常用:第3种;

 1 public class Demo {
 2     public static void main(String[] args) throws ClassNotFoundException {
 3         Student stu = new Student();//会产生:Student对象空间,Class对象空间
 4         //方式一:获取Class对象
 5         Class stuClass1 = stu.getClass();
 6         //方式二:静态的class属性
 7         Class stuClass2 = Student.class;
 8     //    Class intClass = int.class;//基本数据类型也有
 9         System.out.println("stuClass1 == stuClass2 : " + (stuClass1 == stuClass2));
10
11         //方式三:Class的静态方法forName()
12     //    Class stuClass3 = Class.forName("Student");//运行时异常:java.lang.ClassNotFoundException
13         Class stuClass3 = Class.forName("cn.itcast.demo01_获取Class对象的三种方式.Student");
14         System.out.println("stuClass1 == stuClass3 : " + (stuClass1 == stuClass3));
15
16     }
17 }
18 public class Student {
19     private String name;
20 }

2.通过反射获取无参_有参构造方法并使用

通过反射获取无参_有参构造方法并使用:

Class:
 //---批量的;
Constructor[] getConstructors():获取所有的"公有"构造方法;
Constructor[] getDeclaredConstructors()::获取所有的(包括私有的)构造方法;

每一个Constructor内部都包含了"一个构造方法"的详细信息;

//---获取某个Constructor对象
public Constructor getConstructor(Class ... parameterTypes):获取某个公有的构造方法
public Constructor getDeclaredConstructor(Class<?>... parameterTypes):获取某个构造方法(包括私有的)

//Constructor的成员方法:
public Object newInstance(Object... initargs):创建这个Class类所表示的类的一个对象;

 1 public class Demo {
 2     public static void main(String[] args) throws Exception{
 3         //*********获取Class对象************//
 4         Class stuClass = Class.forName("cn.itcast.demo02_通过反射获取无参_有参构造方法并使用.Student");
 5         //*********获取所有的"公有的"构造方法*********
 6         Constructor[] conArray = stuClass.getConstructors();
 7         //遍历
 8         System.out.println("**********所有   公共的       构造方法***********");
 9         for(Constructor c : conArray){
10             System.out.println(c);
11         }
12
13         //********获取所有的构造方法***********//
14         System.out.println("**********所有构造方法(包括私有)***********");
15         conArray = stuClass.getDeclaredConstructors();
16         for(Constructor c : conArray){
17             System.out.println(c);
18         }
19         /*
20          * class Class{
21          *         public Constructor getConstructor(){
22          *             return new Constructor();
23          *         }
24          * }
25          * class Constructor{
26          * }
27          */
28         System.out.println("**********获取单个,公有,无参的构造方法,并调用***********");
29         Constructor con = stuClass.getConstructor();//获取无参的
30         Object obj = con.newInstance();
31         System.out.println("obj = " + obj);
32         System.out.println("**********获取单个,公有,带参的构造方法,并调用***********");
33         con = stuClass.getConstructor(int.class);//获取int参数的公有构造方法
34         con.newInstance(20);//20就是"实参",使用这个实参去调用此构造方法
35
36         System.out.println("**********获取私有,带参的构造方法,并调用***********");
37         con = stuClass.getDeclaredConstructor(String.class,boolean.class);
38         con.setAccessible(true);//如果是私有的,设置暴力访问
39         con.newInstance("刘德华",false);
40
41
42
43     }
44 }
 1 public class Student {
 2     //************构造方法************//
 3     //公有无参
 4     public Student(){
 5         System.out.println("Student类的公有,无参的构造方法被执行......");
 6     }
 7     //公有带参
 8     public Student(int n){
 9         System.out.println("Student类的公有,带参的构造方法被执行,n = " + n);
10     }
11
12     //受保护的
13     protected Student(String s){
14         System.out.println("Student类的受保护的构造方法被执行,s = " + s);
15     }
16
17     //默认的
18     Student(char c){
19         System.out.println("Student类的默认的构造方法被执行, c = " + c);
20     }
21     //私有的
22     private Student(String s ,boolean b){
23         System.out.println("Student类的私有的构造方法被执行,s = " + s + ",b = " + b);
24     }
25 }

3.通过反射获取成员变量并使用

通过反射获取成员变量并使用

Class类:

----批量的:
 Field[] getFields():获取所有公有的成员变量
Field[] getDeclaredFields():获取所有成员变量(包括私有)
----单个的:
Field getField():获取单个,公有的成员变量
Field getDeclaredField():获取单个的成员变量,包括私有的
----为成员变量赋值:
Filed --> set(Object obj,Object value)

 1 public class Demo {
 2     public static void main(String[] args) throws Exception {
 3         //1.获取Class对象
 4         Class stuClass = Class.forName("cn.itcast.demo03_通过反射获取成员变量并使用.Student");
 5         System.out.println("*********获取所有公有的成员变量************");
 6         Field[] fieldArray = stuClass.getFields();
 7         for(Field f : fieldArray){
 8             System.out.println(f);
 9         }
10         System.out.println("*********获取所有的成员变量(包括私有的)************");
11         fieldArray = stuClass.getDeclaredFields();
12         for(Field f : fieldArray){
13             System.out.println(f);
14         }
15         System.out.println("*********获取单个公有的成员变量,并赋值************");
16         Field f = stuClass.getField("name");
17         //赋值前,一定要确保堆中有"对象空间",所有要先创建一个对象
18         Object obj = stuClass.getConstructor().newInstance();//调用公有无参的构造方法
19         f.set(obj, "刘德华");
20
21         System.out.println("*********获取私有的成员变量,并赋值*********************");
22         f = stuClass.getDeclaredField("address");
23         f.setAccessible(true);//设置暴力访问
24         f.set(obj, "北京市");
25         //验证
26         Student stu = (Student)obj;
27         System.out.println("Student的 name = " + stu.name + " address = " + stu.getAddress());
28
29
30
31     }
32 }
 1 public class Student {
 2     //*********成员变量**********//
 3     public String name;
 4     protected int age;
 5     char sex;
 6     private String address;
 7
 8     public String getAddress(){
 9         return this.address;
10     }
11
12
13 }

4.通过反射获取成员方法并使用

获取成员方法:

Class类的:

----批量的:
 Method[] getMethods():获取所有公有的成员方法;
 Method[] getDeclaredMethods():获取所有的成员方法包括私有的。
 ----单个:
 Method getMethod():获取单个公有的成员方法;
 Method getDeclaredMethod():获取单个成员方法,包括私有的;

----调用方法:
 Method --> public Object invoke(Object obj,Object... args)

 1 public class Demo {
 2     public static void main(String[] args) throws Exception{
 3         //1.获取Class对象
 4         Class stuClass = Class.forName("cn.itcast.demo04_通过反射获取成员方法并使用.Student");
 5         System.out.println("*****************************获取所有公有的成员方法*****************************");
 6         Method[] methodArray = stuClass.getMethods();//包含了父类的公有的
 7         for(Method m : methodArray){
 8             System.out.println(m);
 9         }
10
11         System.out.println("*****************************获取所有的成员方法(包括私有的)*****************************");
12         methodArray = stuClass.getDeclaredMethods();//不包含继承的;
13         for(Method m : methodArray){
14             System.out.println(m);
15         }
16         System.out.println("*****************************获取单个公有的,无参的并调用*****************************");
17         Method m = stuClass.getMethod("show1");
18         //实例化一个对象
19         Object obj = stuClass.newInstance();
20         m.invoke(obj);
21
22         System.out.println("*****************************获取单个公有的,带参的,带返回值并调用*****************************");
23
24         m = stuClass.getMethod("show2", String.class,int.class);
25         Object result = m.invoke(obj, "张三",20);//传递实参,并接受返回值;
26         System.out.println("返回值为:" + result);
27
28         System.out.println("*****************************获取单个私有的,带参的并调用*****************************");
29         m = stuClass.getDeclaredMethod("show5", int.class);
30         m.setAccessible(true);//暴力访问
31         m.invoke(obj, 20);
32
33     }
34 }
 1 public class Student {
 2     public void show1(){
 3         System.out.println("公有的,无参的show1()方法......");
 4     }
 5     public int show2(String s,int n){
 6         System.out.println("公有 show2()方法:s = " + s + " , n = " + n );
 7         return 1000;
 8     }
 9
10     protected void show3(int n){
11         System.out.println("受保护的show3()方法:n = " + n);
12     }
13
14     void show4(int n){
15         System.out.println("默认的show4()方法:n = " + n);
16     }
17     private void show5(int n){
18         System.out.println("私有的show5()方法:n = " + n);
19     }
20 }

5.通过反射运行配置文件内容

 1 public class Demo {
 2     public static void main(String[] args) throws Exception{
 3         /*Student stu = new Student();
 4         stu.show();*/
 5
 6         //后期升级,Student类需要改为:Teacher,
 7         //         show()方法需要改为:fun()方法;
 8         //1.新建Teacher类,并添加fun()方法;
 9         //2.此Demo类中的代码需要修改;
10
11         //为了在更新程序时,避免修改其它已有的源码,可以使用:"反射机制"
12     //    Class stuClass = Class.forName("cn.itcast.demo05_通过反射运行配置文件内容.Student");
13         //1.建立配置文件;
14         //2.在配置文件中,建立:键值对;
15         //3.此处,使用"键名";获取相应的"值"
16         Class stuClass = Class.forName(getValue("className"));//"cn.itcast.demo05_通过反射运行配置文件内容.Student"
17         //获取Method对象
18     //    Method m = stuClass.getMethod("show");
19         Method m = stuClass.getMethod(getValue("methodName"));//show
20         //调用show()方法
21         m.invoke(stuClass.newInstance());
22
23
24     }
25     //此方法,从配置文件中,根据某个key获取对应的value
26     private static String getValue(String key) throws IOException{
27         FileReader in = new FileReader("my.properties");
28         Properties pro = new Properties();
29         //读取配置文件
30         pro.load(in);
31         in.close();
32
33         return pro.getProperty(key);
34
35     }
36 }
37
38 public class Student {
39     public void show(){
40         System.out.println("is show()");
41     }
42 }
43
44 public class Teacher {
45     public void fun(){
46         System.out.println(" Teacher--> fun()");
47     }
48 }

6.通过反射越过泛型检查

 1 import java.lang.reflect.Method;
 2 import java.util.ArrayList;
 3
 4 /*
 5  * 通过反射越过泛型检查
 6  *
 7  * 1.有一个具有String泛型的ArrayList,问:怎么可以向集合中添加一个数字:
 8  *
 9  *
10  */
11 public class Demo {
12     public static void main(String[] args) throws Exception{
13         ArrayList<String> strList = new ArrayList<>();
14     //    strList.add(20);
15
16         //泛型,只在"编译期",生成class后,泛型就没有了
17         //1.获取ArrayList的Class对象
18         Class listClass = strList.getClass();
19         //2.获取add()方法
20         Method addMethod = listClass.getMethod("add", Object.class);
21         //3.调用Method对象的方法,执行add()方法
22         addMethod.invoke(strList, 20);
23         addMethod.invoke(strList, 30);
24         addMethod.invoke(strList, "abc");
25
26         //测试:遍历strList
27         for(Object obj : strList){
28             System.out.println(obj);
29         }
30
31     }
32 }

7.写一个通用的设置某个对象的某个属性为指定的值

 1 import java.lang.reflect.Field;
 2
 3 /*
 4  * 写一个通用的设置某个对象的某个属性为指定的值的方法
 5  *
 6  * 1.写一个通用的方法
 7  * 2.可以:对某个对象,的某个属性,赋值为某个值
 8  */
 9 public class Demo {
10     public static void main(String[] args) throws Exception {
11
12         Cat cat = new Cat();
13         //为cat对象的name属性赋值为:波斯猫
14         setValue(cat,"name","波斯猫");
15
16         //测试
17         cat.print();
18
19         Dog d = new Dog();
20         //为dog对象的color属性设置为:白色
21         setValue(d,"color","白色");
22         //测试
23         d.print();
24     }
25     public static void setValue(Object obj, String fieldName, Object value)
26             throws Exception {
27         // 1.获取obj的Class对象
28         Class c = obj.getClass();
29         // 2.获取Field对象
30         Field f = c.getDeclaredField(fieldName);
31         // Field对象所代表的字段,可能是private私有的
32         //设置暴力访问
33         f.setAccessible(true);
34         //3.设置
35         f.set(obj, value);
36
37     }
38 }
39
40 public class Cat {
41     private String name;
42
43     public void print(){
44         System.out.println("Cat name = " + name);
45     }
46 }
47
48 public class Dog {
49     private String color;
50
51     public void print(){
52         System.out.println("Dog color = " + color);
53     }
54 }

8.代理模式

1.在不改变原类的基础上,可以为原类增加一些其他功能;
 2.当有代理后,我们可以直接面对:代理类

有一个类,访问数据库中的Student表:
 class StudentService{
 public void add(){
 //添加一条Student信息;
}
public void delete(){
 //删除数据库中一条Student信息;
 }
 }

现在要求,在不更改原类的基础上,在调用这两个方法时,都要做两个操作:
 1.在调用此方法之前:检查:是否有权限;
 2.在调用此方法之后:写日志;

建立一个"代理类",后期使用,直接使用此代理类;

缺陷:如果其它类,也需要加这两个方法,也得添加代理类,这样会导致类太多;

 1 public class Demo {
 2     public static void main(String[] args) {
 3         /*StudentService stuService = new StudentService();
 4         stuService.add();
 5         stuService.delete();*/
 6
 7         //直接面对代理
 8         StudentServiceProxy proxy = new StudentServiceProxy();
 9         proxy.add();
10         proxy.delete();
11     }
12 }
13
14 public class StudentService {
15     public void add(){
16         System.out.println("添加一条数据......");
17     }
18     public void delete(){
19         System.out.println("删除一条数据......");
20     }
21 }
22
23 public class StudentServiceProxy {
24     private StudentService stuService = new StudentService();
25
26     public void add(){
27         check();
28         stuService.add();
29         log();
30     }
31     public void delete(){
32         check();
33         stuService.delete();
34         log();
35     }
36
37     private void check(){
38         System.out.println("先期进行权限检查......");
39     }
40     private void log(){
41         System.out.println("后期进行记录日志.....");
42     }
43
44
45 }

9.动态代理的概述和实现

之前的代理模式有个缺陷,如果其它类也需要增加那两个操作,也必须要增加一个代理类,
 这样使用起来比较麻烦;

Java中提供了"动态代理":不需要"代理类",动态代理机制会为要代理的类,自动产生一个代理对象;
 Java中的动态代理是基于"接口"的,需要代理的类,一定要是某个接口的实现类;

步骤:
 1.定义一个类,实现:InvocationHandler
 2.在使用时,使用Proxy:newProxyInstance()方法产生代理对象;

 1 public class Demo {
 2     public static void main(String[] args) {
 3         IService stuService = (IService)Proxy.newProxyInstance(
 4                                                 StudentService.class.getClassLoader(),
 5                                                 StudentService.class.getInterfaces(),
 6                                                 new MyInvocationHandler(new StudentService())
 7                 );
 8
 9
10         stuService.add();
11         stuService.delete();
12
13         IService teaService = (IService)Proxy.newProxyInstance(TeacherService.class.getClassLoader(),
14                                                                 TeacherService.class.getInterfaces(),
15                                                                 new MyInvocationHandler(new TeacherService()));
16         teaService.add();
17         teaService.delete();
18
19
20     }
21 }
1 public interface IService {
2     public void add();
3     public void delete();
4 }
 1 import java.lang.reflect.InvocationHandler;
 2 import java.lang.reflect.Method;
 3
 4 public class MyInvocationHandler implements InvocationHandler {
 5     //要代理的对象;
 6     private Object target;
 7
 8     //通过构造方法赋值
 9     public MyInvocationHandler(Object obj){
10         this.target = obj;
11     }
12
13     @Override
14     public Object invoke(Object proxy, Method method, Object[] args)
15             throws Throwable {
16         this.check();
17         //调用应该调用的方法;
18         Object result = method.invoke(this.target, args);
19         this.log();
20         //返回方法调用的结果
21         return result;
22     }
23
24     //为代理对象额外添加的操作
25     private void check(){
26         System.out.println("先期进行权限检查......");
27     }
28     private void log(){
29         System.out.println("后期进行记录日志.....");
30     }
31
32 }
1 public class StudentService implements IService{
2     public void add(){
3         System.out.println("添加一条数据......");
4     }
5     public void delete(){
6         System.out.println("删除一条数据......");
7     }
8
9 }
 1 public class TeacherService implements IService{
 2
 3     @Override
 4     public void add() {
 5         System.out.println("添加一条Teacher信息......");
 6     }
 7
 8     @Override
 9     public void delete() {
10         System.out.println("删除一条Teacher信息......");
11     }
12
13 }

10.模版设计模式概述和使用

 1 abstract class Person{
 2     //模板方法
 3     void show(){
 4         System.out.println("我是传智播客的一名 " + getType() + " ,我骄傲!!");
 5     }
 6     abstract String getType();
 7 }
 8 class Student extends Person{
 9     @Override
10     String getType() {
11         return "学生";
12     }
13 }
14 class Teacher extends Person{
15     @Override
16     String getType() {
17         return "教师";
18     }
19 }
20 public class Demo {
21     public static void main(String[] args) {
22         Student stu = new Student();
23         stu.show();//show()是继承的
24
25         Teacher tea = new Teacher();
26         tea.show();//
27     }
28 }

11.装饰模式

 1 public static void main(String[] args) {
 2         //我们可以直接使用具体的产品
 3         /*ThinkPadX240 x240 = new ThinkPadX240();
 4         x240.sellComputer();
 5
 6         ThinkPadX550 x550 = new ThinkPadX550();
 7         x550.sellComputer();*/
 8
 9         //我们去西三旗经销商那里去买
10
11
12         ThinkPad_XSQ_Dealer xsq = new ThinkPad_XSQ_Dealer(new ThinkPadX240());
13         xsq.sellComputer();
14
15         //去中关村买
16         ThinkPad_ZGC_Dealer zgc = new ThinkPad_ZGC_Dealer(new ThinkPadX550());
17         zgc.sellComputer();
18         System.out.println("-------------------------------------");
19         IThinkPad think = new ThinkPad_XSQ_Dealer(new ThinkPad_ZGC_Dealer(new ThinkPadX240()));
20         think.sellComputer();
21
22     }
23 }
24
25 public abstract class AbstractThinkPadDealer implements IThinkPad{
26     private IThinkPad think;
27
28     public AbstractThinkPadDealer(IThinkPad think){
29         this.think = think;
30     }
31
32     @Override
33     public void sellComputer() {
34         this.think.sellComputer();
35     }
36
37
38 }
39
40 public interface IThinkPad {
41     void sellComputer();
42 }
43
44 public class ThinkPad_XSQ_Dealer extends AbstractThinkPadDealer {
45
46     public ThinkPad_XSQ_Dealer(IThinkPad think) {
47         super(think);
48     }
49     public void sellComputer(){
50         super.sellComputer();
51         System.out.println("西三旗经销商,赠送一套三居室......");
52
53     }
54
55 }
56
57 public class ThinkPad_ZGC_Dealer extends AbstractThinkPadDealer {
58
59     public ThinkPad_ZGC_Dealer(IThinkPad think) {
60         super(think);
61     }
62
63     public void sellComputer(){
64         super.sellComputer();
65         System.out.println("中关村经销商,赠送一辆劳斯莱斯......");
66     }
67
68 }
69
70 public class ThinkPadX240 implements IThinkPad {
71     @Override
72     public void sellComputer() {
73         System.out.println("ThinkPadX240部门:卖一台X240");
74     }
75
76 }
77
78 public class ThinkPadX550 implements IThinkPad {
79
80     @Override
81     public void sellComputer() {
82         System.out.println("ThinkPadX550部门:卖一台X550");
83     }
84
85 }

12.JDK5的新特性

 1 import java.util.ArrayList;
 2
 3 /*
 4  * JDK5的新特性:
 5  *     自动装箱和拆箱:
 6     泛型:
 7     增强for循环:
 8     静态导入:
 9     可变参数:
10     枚举
11
12  */
13 //静态导入:导入某个类中的静态方法
14 import static java.lang.Math.abs;//可以使用通配符
15 public class Demo {
16     public static void main(String[] args) {
17         //自动装箱和拆箱
18         Integer intObj = 20;//自动装箱
19         int num = intObj + 10;//自动拆箱
20         //泛型
21         ArrayList<String> strList = new ArrayList<>();
22         strList.add("aaa");
23         //增强for:可以遍历数组,Collection类型的集合(List和Set)
24         for(String s : strList){
25             System.out.println(s);
26         }
27
28         //静态导入:
29         System.out.println("-5的绝对值:" + abs(-5));
30
31         //可变参数
32         //调用可变参数的方法,可以不传递参数
33         System.out.println(sum());
34         System.out.println(sum(10,3,24,32,44,2,432,4,32,4325,24324,32,43,24,324,32,4));
35
36     }
37
38     //具有可变参数的方法
39     public static int sum(int...nums){
40         int sum = 0;
41         for(int i : nums){
42             sum+=i;
43         }
44         return sum;
45     }
46 }

13.自定义枚举

回顾:单例模式:在程序运行期间,某些类的只能有一个对象存在;

多例模式:在程序运行期间,有些类只允许有特定数量的对象。
例如:一张扑克是一个类;全局只需要:54个对象;
 筛子:

枚举,就是基于多例模式的:

例如:我们程序需要使用到颜色,我们使用MyColor类定义颜色,但只需要用到三种颜色:红、绿、蓝,
 所以运行时,只需要有三个MyColor对象即可;

 1 public class Demo {
 2     public static void main(String[] args) {
 3     //    MyColor c1 = new MyColor();//不能直接构造对象
 4         MyColor c1 = MyColor.RED;
 5         System.out.println(c1);
 6         c1.show();
 7
 8         MyColor c2 = MyColor.BLUE;
 9         System.out.println(c2);
10         c2.show();
11
12         MyColor c3 = MyColor.GREEN;
13         System.out.println(c3);
14         c3.show();
15
16     }
17 }
18
19 /*
20  * 多例模式的MyColor:
21  *
22  * 1.将构造方法私有化。
23  * 2.内部提供三个MyColor对象;作为成员变量
24  */
25
26 public abstract  class MyColor {
27     public static MyColor RED = new MyColor("红"){//匿名的内部子类对象
28         @Override
29         public void show() {
30             System.out.println("红色的show()方法");
31         }
32     };
33     public static MyColor GREEN = new MyColor("绿"){
34         @Override
35         public void show() {
36             System.out.println("绿色的show()方法");
37         }
38
39     };
40     public static MyColor BLUE = new MyColor("蓝"){
41         @Override
42         public void show() {
43             System.out.println("蓝色的show()方法");
44         }
45
46     };
47     //增加其它成员变量
48     private String name;
49
50     //将构造
51     private MyColor(String name){
52         this.name = name;
53     }
54
55     public String toString(){
56         return "我是:" + name + " 色的。";
57     }
58     //添加一个抽象方法
59     public abstract void show();
60
61 }

14.通过enum实现枚举类

 1 public class Demo {
 2     public static void main(String[] args) {
 3         MyColor c1 = MyColor.RED;
 4         System.out.println(c1);
 5         c1.show();
 6
 7         MyColor c2 = MyColor.GREEN;
 8         System.out.println(c2);
 9         c2.show();
10
11
12     }
13 }
14
15 public enum MyColor {
16     RED("红"){
17         public void show() {
18             System.out.println("我是红色的");
19         }
20     },GREEN("绿"){
21         public void show() {
22             System.out.println("我是绿色的");
23         }
24     },BLUE("蓝"){
25         public void show() {
26             System.out.println("我是蓝色的");
27         }
28     };
29     //可以定义自有的成员变量,但,一定要放在枚举项之后。也就是:保证枚举项在先;
30     private String name;
31
32     private MyColor(String name){
33         this.name = name;
34     }
35
36     public String toString(){
37         return this.name;
38     }
39     //可以定义抽象方法
40     public abstract void show();
41 }
42
43 public enum MyColor2 {
44     RED,GREEN,BLUE;
45     private String name;
46 }

15.enum类的常用方法

枚举类的常用方法:
 int compareTo(E o):比较索引
 String name():获取名称:
 int ordinal():取出索引
 String toString():
 <T> T valueOf(Class<T> type,String name)
 values() :没有在帮助文档中出现,但反编译后能看到此方法;
以数组的方式返回内部的所有枚举项;

 1 public class Demo {
 2     public static void main(String[] args) {
 3         MyColor c1 = MyColor.RED;
 4         MyColor c2 = MyColor.GREEN;
 5         MyColor c3 = MyColor.BLUE;
 6
 7         System.out.println("c1.compareTo(c2) : " + c1.compareTo(c2));//比较是索引
 8         System.out.println("c2.compareTo(c1) : " + c2.compareTo(c1));
 9
10         System.out.println("c1.compareTo(c3) : " + c1.compareTo(c3));
11
12         System.out.println("c1.name() : " + c1.name());//变量(枚举项)的名字
13         System.out.println("c2.nane() : " + c2.name());
14
15         System.out.println("c1.ordinal() : " + c1.ordinal());
16         System.out.println("c2.ordinal() : " + c2.ordinal());
17         System.out.println("c3.ordinal() : " + c3.ordinal());
18
19         System.out.println(c1.toString());
20         System.out.println(c2.toString());
21         System.out.println(c3.toString());
22
23         //获取蓝色的枚举项
24         MyColor c4 = MyColor.valueOf(MyColor.class,"BLUE");
25         System.out.println("c4 = " + c4);
26
27         //遍历枚举
28         MyColor[] colorArray = MyColor.values();
29         for(MyColor c : colorArray){
30             System.out.println(c);
31         }
32
33
34     }
35 }
36
37 public enum MyColor {
38     RED("红"){
39         public void show() {
40             System.out.println("我是红色的");
41         }
42     },GREEN("绿"){
43         public void show() {
44             System.out.println("我是绿色的");
45         }
46     },BLUE("蓝"){
47         public void show() {
48             System.out.println("我是蓝色的");
49         }
50     };
51     //可以定义自有的成员变量,但,一定要放在枚举项之后。也就是:保证枚举项在先;
52     private String name;
53
54     private MyColor(String name){
55         this.name = name;
56     }
57
58     public String toString(){
59         return this.name;
60     }
61     //可以定义抽象方法
62     public abstract void show();
63 }

16.JDK7的新特性

二进制字面量:
 数字字面量可以出现下划线
switch 语句可以用字符串
泛型简化
异常的多个catch合并
try-with-resources 语句

 1 public class Demo {
 2     public static void main(String[] args) {
 3         //八进制
 4         System.out.println(010);//8
 5         //二进制:字面量
 6         System.out.println(0b1010);
 7         //2.数字字面量可以出现下划线
 8         System.out.println(12_345_6_7_8.00);
 9         //3.switch 语句可以用字符串
10         String s = "+";
11         switch(s){
12             case "+":
13                 System.out.println("加法");
14                 break;
15             case "-":
16                 System.out.println("减法");
17                 break;
18             case "*":
19                 System.out.println("乘法");
20                 break;
21             case "/":
22                 System.out.println("除法");
23                 break;
24         }
25         //4.泛型简化
26         ArrayList<String> list = new ArrayList<>();
27         //5.异常的多个catch合并
28         try{
29
30         }catch(NullPointerException | ArithmeticException  e){
31
32         }
33
34         //6.try-with-resources 语句
35         //之前的try...catch形式;
36         /*FileInputStream in = null;
37         FileOutputStream out = null;
38         try {
39             in = new FileInputStream("aa.txt");
40              out = new FileOutputStream("bb.txt");
41         } catch (FileNotFoundException e) {
42             e.printStackTrace();
43         }finally{
44             if(in != null){
45                 try {
46                     in.close();
47                 } catch (IOException e) {
48                     e.printStackTrace();
49                 }
50             }
51             if(out != null){
52                 try {
53                     out.close();
54                 } catch (IOException e) {
55                     e.printStackTrace();
56                 }
57             }
58         }*/
59
60         //JDK7以后
61         try(
62                 //在try中定义的变量,不需要我们手动关闭,用完后,虚拟机可以为我们关闭;所以,不需要finally语句;也不用关闭
63                 FileInputStream in = new FileInputStream("aa.txt");
64                 FileOutputStream out = new FileOutputStream("bb.txt");
65         ){
66
67         }catch(FileNotFoundException e){
68
69         } catch (IOException e) {
70             e.printStackTrace();
71         }
72
73
74     }
75 }
时间: 2024-08-05 01:38:48

java--反射--黑马程序员的相关文章

反射 黑马程序员

public class ReflectTester { public Object copy(Object object) throws Exception { // 获得对象的类型 Class<?> classType = object.getClass(); System.out.println("Class:" + classType.getName()); // 通过默认构造方法创建一个新的对象,new Class[] {} 没参数表示用默认的构造方法 Objec

黑马程序员--Java基础--01基本概念

1.Java的三大技术架构 JAVAEE(Java Platform Enterprise Edition):  开发企业环境下的应用程序,主要针对web程序开发: JAVASE(Java Platform Standard Edition): 完成桌面应用程序的开发,是其他两者的基础 JAVAME(Java Platform Micro Edition): 开发电子消费产品和嵌入式设备,如手机中的程序 我对三大技术构架理解 1.三大技术是指哪三大技术呢? 答:三大技术分别指JAVAEE,JAV

黑马程序员-C语言基础:指针类型与指针和数组、字符串的关系

//指针变量就是用来存储地址的,只能存储地址 格式:  int  *p;  这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的存储空间: int *p = &a;//这样一句可以写,此时的*只是一个标志,表示这个*只是表示p是个指针: *p = &a;//这样写就错了:此时*p表示取p指向的空间的值: 指针疑问:指针既然都占据8个字节,那么为什么要划分类型, 是因为当用*p指针取值或者赋值的时候,知道该取几个字节,比

黑马程序员——java基础——反射

 黑马程序员--java基础--反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 反射 其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员. 反射就是把Java类中的各种成分映射成相应的java类. 简单说:反射技术可以对一个类进行解剖. 反射的基石-->Class类 1.java中的类是用来描述一类事物的共性,该类事物有什么属性,没有什么属性

黑马程序员------Java反射学习总结(一)

-------------------------Java培训.Android培训,期待与您交流!----------------------------- 一.反射的概念 1) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2)一句话来讲,反射就是将Java类中的各个成分映射成相应的Java类. 3)即在Java中,描述事物的各种

黑马程序员——【Java高新技术】——代理

一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理.日志.计算方法的运行时间.事务管理等等,如何去做? 解答:编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码. 2.代理原理图,如下: 3.代理的优点 如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在配置文件中配置是使用目标类.还是代理类,这样以后很容易切换.例如,想要日志功能时就

黑马程序员——java高新---注解、泛型等

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.注解 什么是注解? 答:对于过时的语句,java会提示过时了,通过@SuppressWarnings("Deprecation")可以在DOS命令行中取消提示,但Eclipse无法取消.这就是注解,相当于标记.编译器.开发工具.javac通过反射获得注解里的内容,进而明确应该做什么.不应该做什么.注解可以加在包.类.属性.方法.参数及局部变量之上.一个注解就是一个类. java.

黑马程序员——高新技术---反射

黑马程序员——高新技术---反射 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射把Java类中的各种成分映射成相应的Java类,例如一个Java类中用一个Class类的对象表示,一个类中的组成部分:成员变量,方法,构造方

黑马程序员_Java反射机制

一切的操作都将使用Object完成,类,数组的引用都可以使用Object来接收 1,认识Class类 以前要是想知道一个类中的属性,成员变量,方法等等的信息的话,需要通过new这个类的对象才能得到这些信息,但是在Java中,也允许一个实例化对象找到一个类的完整的信息,这个类就是Class类,Class类是继承Object类的. 正常方式:  引入需要的"包.类"名称 >取得实例化对象 反射方式:  实例化对象>得到完整的"包.类"名称 getClass(

黑马程序员_高新技术_1_Java反射

------- android培训.java培训.期待与您交流! ---------- 0.反射知识体系 下图为反射整体的知识体系,把握住此图也就全局上掌握住反射所有内容. 1.反射概论 1)反射概念 其实字面上可以这么理解反射,平时使用类时都是由类new出对象,而反射则是通过对象"反射"出类的信息,好比一个人照镜子可以看到人类的特征,而看出机制就是镜子反射. 2)Java对象两种类型 Java程序中的许多对象在运行时会出现两种类型:编译时类型和运行时类型.如下代码: Person p