第十六章总结:反射和注解

1:访问构造方法 

反射:

1.class类

2.获取构造方法

3.获取成员属性

4.获取成员方法

注解

1.内置注解

2.反射注解

3

创建Class对象的三种方式

1.使用getClass()方法

object str = new object();

class c = str.getClass()

 
  1. Demo1 d1 = new Demo1();

  2. Class c1 = d1.getClass();

2.使用.class属性

class c = object.class

Class c2 = Demo1.class;

3.使用class类的forname方法

class c = class.forname("全路径")

 
  1. Class c3 = Class.forName("com.mr.Demo1");

创建class,包会自动创建 

 
  1. package com.mr;

  2. public class Demo1 {

  3. String s;

  4. int i, i2, i3;

  5. private Demo1() {

  6. }

  7. protected Demo1(String s, int i) {

  8. this.s = s;

  9. this.i = i;

  10. }

  11. public Demo1(String... strings) throws NumberFormatException {

  12. if (0 < strings.length)

  13. i = Integer.valueOf(strings[0]);

  14. if (1 < strings.length)

  15. i2 = Integer.valueOf(strings[1]);

  16. if (2 < strings.length)

  17. i3 = Integer.valueOf(strings[2]);

  18. }

  19. public void print() {

  20. // TODO Auto-generated method stub

  21. System.out.println("s=" + s);

  22. System.out.println("i=" + i);

  23. System.out.println("i2=" + i2);

  24. System.out.println("i3=" + i3);

  25. }

  26. }

  27. //例题16.1

 
  1. import java.lang.reflect.Constructor;

  2. import com.mr.Demo1;

  3. public class ConstructorDemo1 {

  4. public static void main(String[] args) {

  5. Demo1 d1 = new Demo1("10", "20", "30");

  6. Class<? extends Demo1> demoClass = d1.getClass();

  7. // 获得所有构造方法

  8. Constructor[] declaredConstructors = demoClass.getDeclaredConstructors();

  9. for (int i = 0; i < declaredConstructors.length; i++) { // 遍历构造方法

  10. Constructor<?> constructor = declaredConstructors[i];

  11. System.out.println("查看是否允许带有可变数量的参数:" + constructor.isVarArgs());

  12. System.out.println("该构造方法的入口参数类型依次为:");

  13. Class[] parameterTypes = constructor.getParameterTypes(); // 获取所有参数类型

  14. for (int j = 0; j < parameterTypes.length; j++) {

  15. System.out.println(" " + parameterTypes[j]);

  16. }

  17. System.out.println("该构造方法可能抛出的异常类型为:");

  18. // 获得所有可能抛出的异常信息类型

  19. Class[] exceptionTypes = constructor.getExceptionTypes();

  20. for (int j = 0; j < exceptionTypes.length; j++) {

  21. System.out.println(" " + exceptionTypes[j]);

  22. }

  23. Demo1 d2 = null;

  24. try { // 如果该成员变量的访问权限为private,则抛出异常,即不允许访问

  25. if (i == 2) // 通过执行默认没有参数的构造方法创建对象

  26. d2 = (Demo1) constructor.newInstance();

  27. else if (i == 1)

  28. // 通过执行具有两个参数的构造方法创建对象

  29. d2 = (Demo1) constructor.newInstance("7", 5);

  30. else { // 通过执行具有可变数量参数的构造方法创建对象

  31. Object[] parameters = new Object[] { new String[] { "100", "200", "300" } };

  32. d2 = (Demo1) constructor.newInstance(parameters);

  33. }

  34. } catch (Exception e) {

  35. System.out.println("在创建对象时抛出异常,下面执行setAccessible()方法");

  36. constructor.setAccessible(true); // 设置为允许访问

  37. }

  38. if (d2 != null) {

  39. d2.print();

  40. System.out.println();

  41. }

  42. }

  43. }

  44. }

  45. //例题16.

2:访问成员变量

 
  1. package com.mr;

  2. public class Demo2 {

  3. int i;

  4. public float f;

  5. protected boolean b;

  6. private String s;

  7. }

  8. //例题16.2

 
  1. import java.lang.reflect.Field;

  2. import com.mr.Demo2;

  3. public class FieldDemo {

  4. public static void main(String[] args) {

  5. Demo2 example = new Demo2();

  6. Class exampleC = example.getClass();

  7. // 获得所有成员变量

  8. Field[] declaredFields = exampleC.getDeclaredFields();

  9. for (int i = 0; i < declaredFields.length; i++) { // 遍历成员变量

  10. Field field = declaredFields[i];

  11. System.out.println("名称为:" + field.getName()); // 获得成员变量名称

  12. Class fieldType = field.getType(); // 获得成员变量类型

  13. System.out.println("类型为:" + fieldType);

  14. boolean isTurn = true;

  15. while (isTurn) {

  16. // 如果该成员变量的访问权限为private,则抛出异常,即不允许访问

  17. try {

  18. isTurn = false;

  19. // 获得成员变量值

  20. System.out.println("修改前的值为:" + field.get(example));

  21. if (fieldType.equals(int.class)) { // 判断成员变量的类型是否为int型

  22. System.out.println("利用方法setInt()修改成员变量的值");

  23. field.setInt(example, 168); // 为int型成员变量赋值

  24. } else if (fieldType.equals(float.class)) { // 判断成员变量的类型是否为float型

  25. System.out.println("利用方法setFloat()修改成员变量的值");

  26. field.setFloat(example, 99.9F); // 为float型成员变量赋值

  27. // 判断成员变量的类型是否为boolean型

  28. } else if (fieldType.equals(boolean.class)) {

  29. System.out.println("利用方法setBoolean()修改成员变量的值");

  30. field.setBoolean(example, true); // 为boolean型成员变量赋值

  31. } else {

  32. System.out.println("利用方法set()修改成员变量的值");

  33. field.set(example, "MWQ"); // 可以为各种类型的成员变量赋值

  34. }

  35. // 获得成员变量值

  36. System.out.println("修改后的值为:" + field.get(example));

  37. } catch (Exception e) {

  38. System.out.println("在设置成员变量值时抛出异常," + "下面执行setAccessible()方法!");

  39. field.setAccessible(true); // 设置为允许访问

  40. isTurn = true;

  41. }

  42. }

  43. System.out.println();

  44. }

  45. }

  46. }

  47. //例题16.2

3:访问成员方法

 
  1. package com.mr;

  2. public class Demo3 {

  3. static void staticMethod() {

  4. System.out.println("执行staticMethod()方法");

  5. }

  6. public int publicMethod(int i) {

  7. System.out.println("执行publicMethod()方法");

  8. return i * 100;

  9. }

  10. protected int protectedMethod(String s, int i) throws NumberFormatException {

  11. System.out.println("执行protectedMethod()方法");

  12. return Integer.valueOf(s) + i;

  13. }

  14. private String privateMethod(String... strings) {

  15. System.out.println("执行privateMethod()方法");

  16. StringBuffer stringBuffer = new StringBuffer();

  17. for (int i = 0; i < strings.length; i++) {

  18. stringBuffer.append(strings[i]);

  19. }

  20. return stringBuffer.toString();

  21. }

  22. }

  23. //例题16.3

 
  1. import java.lang.reflect.*;

  2. import com.mr.Demo3;

  3. public class MethondDemo {

  4. public static void main(String[] args) {

  5. Demo3 demo = new Demo3();

  6. Class demoClass = demo.getClass();

  7. // 获得所有方法

  8. Method[] declaredMethods = demoClass.getDeclaredMethods();

  9. for (int i = 0; i < declaredMethods.length; i++) {

  10. Method method = declaredMethods[i]; // 遍历方法

  11. System.out.println("名称为:" + method.getName()); // 获得方法名称

  12. System.out.println("是否允许带有可变数量的参数:" + method.isVarArgs());

  13. System.out.println("入口参数类型依次为:");

  14. // 获得所有参数类型

  15. Class[] parameterTypes = method.getParameterTypes();

  16. for (int j = 0; j < parameterTypes.length; j++) {

  17. System.out.println(" " + parameterTypes[j]);

  18. }

  19. // 获得方法返回值类型

  20. System.out.println("返回值类型为:" + method.getReturnType());

  21. System.out.println("可能抛出的异常类型有:");

  22. // 获得方法可能抛出的所有异常类型

  23. Class[] exceptionTypes = method.getExceptionTypes();

  24. for (int j = 0; j < exceptionTypes.length; j++) {

  25. System.out.println(" " + exceptionTypes[j]);

  26. }

  27. boolean isTurn = true;

  28. while (isTurn) {

  29. try {// 如果该方法的访问权限为private,则抛出异常,即不允许访问

  30. isTurn = false;

  31. if ("staticMethod".equals(method.getName()))

  32. method.invoke(demo); // 执行没有入口参数的方法

  33. else if ("publicMethod".equals(method.getName()))

  34. System.out.println("返回值为:" + method.invoke(demo, 168)); // 执行方法

  35. else if ("protectedMethod".equals(method.getName()))

  36. System.out.println("返回值为:" + method.invoke(demo, "7", 5)); // 执行方法

  37. else if ("privateMethod".equals(method.getName())) {

  38. Object[] parameters = new Object[] { new String[] { "M", "W", "Q" } }; // 定义二维数组

  39. System.out.println("返回值为:" + method.invoke(demo, parameters));

  40. }

  41. } catch (Exception e) {

  42. System.out.println("在执行方法时抛出异常," + "下面执行setAccessible()方法!");

  43. method.setAccessible(true); // 设置为允许访问

  44. isTurn = true;

  45. }

  46. }

  47. System.out.println();

  48. }

  49. }

  50. }

  51. //例题16.3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值