目录
3,对获取的构造方法,通过Constructor对象操作(进行细致操作)
1,理解反射作用
- Java的反射机制是一种动态获取信息以及动态调用对象的方法的功能。
- 简而言之:反射可以获取你想获取的类的内部结构(构造方法,方法,属性等等)
- 并且可以获取他们的细节如方法返回值参数等等,这篇文章主要介绍获取这些基本信息的步骤详细的查看api
- 区分Class和class, java中是区分大小写的,class是关键词表示类,Class是一个类。
本文实例操作的类为Person类:
public class Person {
//公共属性
public String name;
//私有属性
private int age;
//无参构造
public Person() {
this.name = "张三";
this.age = 18;
}
//有参构造
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//私有有参构造
private Person(String name) {
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;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//无参方法
public void eat(){
System.out.println("今天吃了1顿大餐");
}
//带参方法
public void eat(int num){
System.out.println("今天吃了"+num+"顿大餐");
}
//私有方法
private void sleep(){
System.out.println("非常舒服的睡了一觉");
}
}
2,通过反射获取指定类的信息方法三种:
-
通过指定类对象调用getClass()
-
通过Class中静态方法forName(String url) url是指定类的完整名称
-
通过指定类的class属性
代码实例:
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class Demo01GetClass {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//创建Person对象
Person person=new Person();
//获取Class对象三种方法
//第一 通过指定对象调用getClass()方法获取
Class aClass1 = person.getClass();
System.out.println(aClass1);
//第二 通过Class的静态方法forName()获取,括号中方类的名称(不是简写,包括报名的全类名)
Class aClass2 = Class.forName("src.am.demo01.Person");
System.out.println(aClass2);
//第三 通过指定对象的属性class获取
Class<Person> aClass3 = Person.class;
System.out.println(aClass3);
//判断获取到的对象是否为一个对象,结果是true
System.out.println(aClass1==aClass3);
System.out.println(aClass2==aClass3);
}
}
结果:
class src.am.demo01.Person
class src.am.demo01.Person
class src.am.demo01.Person
true
true
这是我的结果前三个表示获取到了对象,后两个表示获取到的对象是一个对象
2,主要掌握Class获取指定类的构造方法,方法,属性
-
构造方法获取getConstructor()
-
方法获取getMethods()
-
属性获取getFields()
- 调用方法都是获取到的Class对象点getConstructor()其他与之类似
- 区分getConstructor()和getConstructors()和getDeclaredConstructor()和getDeclaredConstructors()四个方法的区别,后面有s的返回的是数组就是返回多个的意思,中间有Declared单词的是可以返回private修饰的构造方法
- 其他两个方法与第一个类似
- 他们返回的类型是Constructor,Method,Field,是另外一个对象可以对其进行下一步细致操作
3,对获取的构造方法,通过Constructor对象操作(进行细致操作)
-
获取参数类型
getParameterTypes()
-
获取修饰符
getModifiers()
-
创建指定类对象
newInstance(Object... initargs)
-
获取构造方法名 getName()
实例1代码:
package src.am.demo01;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class Demo01GetClass {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//创建Person对象
Person person=new Person();
//获取Class对象三种方法
//第一 通过指定对象调用getClass()方法获取
Class aClass1 = person.getClass();
System.out.println(aClass1);
//第二 通过Class的静态方法forName()获取,括号中方类的名称(不是简写,包括报名的全类名)
Class aClass2 = Class.forName("src.am.demo01.Person");
System.out.println(aClass2);
//第三 通过指定对象的属性class获取
Class<Person> aClass3 = Person.class;
System.out.println(aClass3);
//判断获取到的对象是否为一个对象,结果是true
System.out.println(aClass1==aClass3);
System.out.println(aClass2==aClass3);
System.out.println("--------------------------------------");
//通过Class对象获取构造方法
Constructor constructor = aClass1.getConstructor();
System.out.println(constructor);
//通过constructor对象获取其他信息
String name = constructor.getName();
System.out.println("构造方法名字 "+name);
Class[] parameterTypes = constructor.getParameterTypes();
System.out.println("构造方法的参数类型 "+ Arrays.toString(parameterTypes));
int modifiers = constructor.getModifiers();//返回的是int类型代表什么修饰符可以查api 1代表public,2是private
String s = modifiers == 1 ? "public" : "private";//1代表public,2是private
System.out.println("构造方法的修饰符 "+s);
Person person1 = (Person) constructor.newInstance();
person1.eat();
System.out.println("--------------------------------------");
//通过Class对象获取构造方法
Constructor constructors = aClass1.getDeclaredConstructor(String.class,int.class);
System.out.println(constructors);
//通过constructor对象获取其他信息
String name1 = constructors.getName();
System.out.println("构造方法名字 "+name1);
Class[] parameterTypes1 = constructors.getParameterTypes();
System.out.println("构造方法的参数类型 "+ Arrays.toString(parameterTypes1));
int modifiers1 = constructors.getModifiers();
String s1 = modifiers1 == 1 ? "public" : "private";
System.out.println("构造方法的修饰符 "+s1);
}
}
结果;
class src.am.demo01.Person
class src.am.demo01.Person
class src.am.demo01.Person
true
true
--------------------------------------
public src.am.demo01.Person()
构造方法名字 src.am.demo01.Person
构造方法的参数类型 []
构造方法的修饰符 public
今天吃了1顿大餐
--------------------------------------
public src.am.demo01.Person(java.lang.String,int)
构造方法名字 src.am.demo01.Person
构造方法的参数类型 [class java.lang.String, int]
构造方法的修饰符 public
实例2:
package src.am.demo01;
import java.lang.reflect.Field;
public class Demo02GetClassFields {
public static void main(String[] args) throws NoSuchFieldException {
//创建Person对象
Person person=new Person();
//获取Class对象
Class<? extends Person> aClass = person.getClass();
//获取属性对象
Field field = aClass.getField("name");
System.out.println("Name属性的类型 "+field.getType());
//返回的是int类型代表什么修饰符可以查api 1代表public,2是private
System.out.println("name属性的修饰符 "+(field.getModifiers()==1?"public":"private"));
}
}
结果:
Name属性的类型 class java.lang.String
name属性的修饰符 public
实例3:
package src.am.demo01;
import java.lang.reflect.Method;
import java.util.Arrays;
public class Demo03GetClassMethods {
public static void main(String[] args) {
Class<Person> personClass = Person.class;
Method[] methods = personClass.getMethods();
for (Method method:methods){
System.out.println("方法名 "+ method.getName());
//返回的是int类型代表什么修饰符可以查api 1代表public,2是private
System.out.println("方法修饰符 "+(method.getModifiers()==1?"public":"private"));
System.out.println("方法的返回值 "+method.getReturnType());
System.out.println("方法的参数类型 "+Arrays.toString(method.getParameterTypes()));
System.out.println("--------------------------------------------");
}
}
}
结果:
方法名 getName
方法修饰符 public
方法的返回值 class java.lang.String
方法的参数类型 []
--------------------------------------------
方法名 toString
方法修饰符 public
方法的返回值 class java.lang.String
方法的参数类型 []
--------------------------------------------
方法名 setName
方法修饰符 public
方法的返回值 void
方法的参数类型 [class java.lang.String]
--------------------------------------------
方法名 setAge
方法修饰符 public
方法的返回值 void
方法的参数类型 [int]
--------------------------------------------
方法名 getAge
方法修饰符 public
方法的返回值 int
方法的参数类型 []
--------------------------------------------
方法名 eat
方法修饰符 public
方法的返回值 void
方法的参数类型 [int]
--------------------------------------------
方法名 eat
方法修饰符 public
方法的返回值 void
方法的参数类型 []
--------------------------------------------
方法名 wait
方法修饰符 private
方法的返回值 void
方法的参数类型 [long]
--------------------------------------------
方法名 wait
方法修饰符 private
方法的返回值 void
方法的参数类型 [long, int]
--------------------------------------------
方法名 wait
方法修饰符 private
方法的返回值 void
方法的参数类型 []
--------------------------------------------
方法名 equals
方法修饰符 public
方法的返回值 boolean
方法的参数类型 [class java.lang.Object]
--------------------------------------------
方法名 hashCode
方法修饰符 private
方法的返回值 int
方法的参数类型 []
--------------------------------------------
方法名 getClass
方法修饰符 private
方法的返回值 class java.lang.Class
方法的参数类型 []
--------------------------------------------
方法名 notify
方法修饰符 private
方法的返回值 void
方法的参数类型 []
--------------------------------------------
方法名 notifyAll
方法修饰符 private
方法的返回值 void
方法的参数类型 []
--------------------------------------------