目录
反射知识点总结
1.反射概念—给成员变量赋值(Field类)
package com.qianfeng.reflect_10;
/**
*
* 什么是反射:
* 反射就是通过获取类的字节码文件对象:Class
* 创建该类的实例(通过构造方法:Constroctor类),调用成员方法(Method类),
* 给成员变量赋值(Field类)
*
* 关于面试题:获取字节码文件的方式有几种
* 三种方式
* 1)Object类的getClass():表中正在运行的Java类(当前类字节码文件)
* 2)任意Java类型的.class属性
* 3)反射Class类中forName("类或者接口的全限定名称") ;
* com.qianfeng.reflect_10.ReflectDemo
* @author zhangyang
*
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
//创建两个Person对象
Person p1 = new Person("高圆圆", 41) ;
Person p2 = new Person("高圆圆", 41) ;
System.out.println(p1==p2);//false
System.out.println(p1.getClass()==p2.getClass());
Class c1 = p1.getClass() ; //class com.qianfeng.reflect_10.Person
Class c2 = p2.getClass() ;
System.out.println(c1==c2);
System.out.println("--------------------------");
//方式2:获取字节码文件
Class c3 = Person.class ;
System.out.println(c3);//class com.qianfeng.reflect_10.Person
Class c4 = Person.class ;
System.out.println(c3==c4);
System.out.println("----------------------------");
//方式3:获取类的字节码文件对象
//public static Class<?> forName(String className)
Class c5 = Class.forName("com.qianfeng.reflect_10.Person") ;
System.out.println(c5);//class com.qianfeng.reflect_10.Person
//推荐:第三种:里面参数一个字符串:可以放在配置文件中使用!
}
}
package com.qianfeng.reflect_10;
public class Person {
//属性
private String name ;//私有的属性
int age ;
public String address ;//地址
//一些列构造方法
public Person() {
}
private Person(String name) {
this.name = name ;
}
Person(String name,int age){
this.name = name ;
this.age = age ;
}
public Person(String name,int age,String address) {
this.name = name ;
this.age = age ;
this.address = address ;
}
//成员方法
public void show() {
System.out.println("show person");
}
public String method(int num) {
return "helloJavaEE"+num ;
}
private void function(String str) {
System.out.println(str);
}
public void function2() {
System.out.println("helloJavaEE,i'm coming...");
}
}
</u>*
2.使用反射获取构造方法并使用,(Constructor)
package com.qianfeng.reflect_01;
import java.lang.reflect.Constructor;
/**
*
* 之前的写法:
* Person p = new Person();通过无参构造方法创建对象
* Person p = new Person("高圆圆"); 形参String---String类型字节码文件格式
* java.lang.String
*
* 使用反射获取构造方法并使用,(Constructor)
*
*
Class 类的实例表示正在运行的 Java 应用程序中的类和接口
* @author zhangyang
*
*/
public class ReflectDemo {
public static void main(String[] args) throws Exception {
//获取Person类的字节码文件对象
//public static Class<?> forName(String className)
Class c = Class.forName("com.qianfeng.reflect_01.Person") ;
//获取构造方法(构造器)对象
//public Constructor<?>[] getConstructors():表示获取当前类中的所有的公共的构造方法
//public Constructor<?>[] getDeclaredConstructors():
//获取当前类中所有的构造方法:包括私有的,公共的,默认,受保护的(proteted)
/*
Constructor[] cons = c.getConstructors() ;
for(Constructor con: cons) {
System.out.println(con);
/**
* public com.qianfeng.reflect_01.Person(java.lang.String,int,java.lang.String)
public com.qianfeng.reflect_01.Person(
*/
//}
/*
Constructor[] cons = c.getDeclaredConstructors() ;
for(Constructor con: cons) {
System.out.println(con);
}
*/
/**
* public com.qianfeng.reflect_01.Person(java.lang.String,int,java.lang.String)
com.qianfeng.reflect_01.Person(java.lang.String,int)
private com.qianfeng.reflect_01.Person(java.lang.String)
public com.qianfeng.reflect_01.Person()
*/
//获取某一个构造方法所在对象:Constructor
//public Constructor<T> getConstructor(Class<?>... parameterTypes)
//获取指定的公共构造方法
//参数:parameterTypes可变参数 里面相当于数组
//参数是当前的字节码文件Class
//Person p = new Person();通过无参构造方法创建对象
//直接输出p----->如果重写toString():成员信息的表达式
Constructor con = c.getConstructor() ;//Person类的无参构造方法
//System.out.println(con);//public com.qianfeng.reflect_01.Person()
//通过构造器如何获取当前Person类的实例
//Constructor创建该类的实例
//public T newInstance(Object... initargs):参数为当前实际参数
Object obj = con.newInstance() ;
System.out.println(obj);//p
System.out.println("--------------------");
Person p = new Person