java 反射
- 反射是一种动态机制,允许我们在代码运行期间来决定
- 实例化对象,调用方法,操作属性等.
- 反射可以提高代码的灵活度,但是会降低执行效率.
- 反射应当在程序中起到"画龙点睛"的作用,而不应当过度依赖反射.
案例需要定义一个类:这里定义了Person类
package reflect;
public class Person {
public void sayHello() {
System.out.println("大家好!");
}
public void sayHaha(){
System.out.println("哈哈!");
}
}
public void say(String name){
System.out.println("大家好!我是:"+name);
}
public void say(String name,int age){
System.out.println("大家好! 我叫"+name+",今年"+age+"岁了");
}
Demo1 相关方法
Class cls=Class.forName("reflect.Person");
String name=cls.getName();
System.out.println(name);
Method[] methods=cls.getDeclaredMethods();
for(Method m:methods){
System.out.println(m.getName());
demo2 使用Class来快速实例化其表示的类的实例
Person p=new Person();
System.out.println(p);
Class cls=Class.forName("reflect.Person");
Object obj=cls.newInstance();
System.out.println(obj);
}
demo3 利用反射动态调用方法
Class cls=Class.forName("reflect.Person");
Object o=cls.newInstance();
Method method=cls.getMethod("sayHaha");
method.invoke(o);
demo4 调用有参方法
public static void main(String[] args) throws Exception {
Class cls= Class.forName("reflect.Person");
Object obj=cls.newInstance();
Method method=cls.getMethod("say", String.class);
method.invoke(obj,"张三");
Method method2 = cls.getMethod("say",String.class,int.class);
method2.invoke(obj,"李四",22);
}
边长参数特性
public static void main(String[] args) {
dosome("a");
dosome("1","b");
dosome("a","b","c");
}
public static void dosome(String... str){
System.out.println(str.length);
}