`
李灵晖-raylee
  • 浏览: 135637 次
博客专栏
Group-logo
从头认识java
浏览量:0
文章分类
社区版块
存档分类
最新评论

从头认识java-12.6 接口与类型信息(怎么绕过接口直接调用类的所有方法)

 
阅读更多

这一章节我们来讨论一下接口与类型信息。

在之前的章节里面我们提到接口,父类引用子类对象,然后把方法给缩窄了,但是我们这一章节学习到反射,这个约束就变得没有那么严格。

我们来看看下面的例子:

package com.ray.ch11;

public class Test {
	public static void main(String[] args) {
		Person man = new Man();
		man.sleep();
		man.run();
		// man.say();//error
	}
}

interface Person {

	public void sleep();

	public void run();
}

class Man implements Person {
	public void say() {
	}

	@Override
	public void sleep() {
	}

	@Override
	public void run() {
	}
}

我们一般的代码就会向上面一样,直接定义接口,然后接口指向实现的类。一般的情况就像上面一样,方法给变少了。但是,我们修改一下方法:

package com.ray.ch11;

public class Test {
	public static void main(String[] args) {
		Person man = new Man();
		man.sleep();
		man.run();
		// man.say();//error
		if (man instanceof Man) {
			Man man2 = (Man) man;
			man2.say();
		}
	}
}

interface Person {

	public void sleep();

	public void run();
}

class Man implements Person {
	public void say() {
	}

	@Override
	public void sleep() {
	}

	@Override
	public void run() {
	}
}

我们修改了一下,通过isInstanceOf方法,来向下转型,这样我们就可以得到Man里面所有的方法,甚至是下面的代码:

package com.ray.ch11;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {
	public static void main(String[] args) {
		try {
			Class<?> manClass = Class.forName("com.ray.ch11.Man");
			Man man = (Man) manClass.newInstance();
			Method[] methods = man.getClass().getDeclaredMethods();
			for (Method method : methods) {
				System.out.println(method.getName());
			}
			Method sayMethod = manClass.newInstance().getClass()
					.getDeclaredMethod("say");
			sayMethod.setAccessible(true);
			sayMethod.invoke(man);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
}

interface Person {

	public void sleep();

	public void run();
}

class Man implements Person {
	private void say() {
		System.out.println("method say");
	}

	@Override
	public void sleep() {
	}

	@Override
	public void run() {
	}
}
通过上面的代码,我们直接调用类里面所有的方法,包括私有方法。

这个对于封装来说是比较致命的,因此,我们提供的服务端代码一般都隐藏了类的信息,例如:

package com.ray.ch11;

public class Test {

	public static Person makePerson() {
		return new Man();
	}

	public static void main(String[] args) {
		Person person = makePerson();
	}
}

interface Person {

	public void sleep();

	public void run();
}

class Man implements Person {
	private void say() {
		System.out.println("method say");
	}

	@Override
	public void sleep() {
	}

	@Override
	public void run() {
	}
}

我们通过一个方法隐含了类的实现,全部是以接口的形式对外展现,这样就可以避免了上面的一些问题。


总结:这一章节主要讲述了接口与类型信息的内容,需要注意跨过接口直接调用类的情况。


这一章节就到这里,谢谢。

-----------------------------------

目录




分享到:
评论

相关推荐

    mchange-commons-java-0.2.11.zip

    在Java开发中,这样的库可以极大地提高开发效率,因为它封装了常见的功能,开发者可以直接使用,而无需从头编写代码。 描述中的 "mchange-commons-java-0.2.11.jar包" 是该库的主要组成部分,是一个Java归档(JAR)...

    aip-java-sdk-4.2.0

    2. **aip-java-sdk-4.2.0.jar**:这是核心的AIP Java SDK库文件,包含了所有用于与百度AI平台交互的类和方法。开发者需要引入这个jar文件到他们的Android项目中,才能使用SDK提供的功能。 3. **json-20160810.jar**...

    eclipse-java-2021-12-R-win32-x86_64.zip

    Eclipse IDE for Java Developers 是一款广泛使用的集成开发环境(IDE),专为Java编程设计。它由Eclipse基金会维护,提供了一整套工具,用于编写、调试、测试和部署Java应用程序。2021-12-R 版本是Eclipse的一个...

    api-ntrip-java-client-master.zip_android_ntrip_ntrip java实现_ntr

    在标签中,“ntrip__java实现”表明这个客户端是用Java编程语言编写的,这是Android应用开发的常见选择,因为Java与Android SDK兼容性良好。“ntrip_android_client”和“ntrip_client”则明确了这是一个面向Android...

    调用阿里云获取城市天气接口

    在IT行业中,与“调用阿里云获取城市天气接口”相关的知识点主要涉及到API接口的使用、网络编程、C#编程语言以及数据解析等技术。以下是对这些知识点的详细说明: 首先,API(Application Programming Interface)...

    Java---笔试题大全

    原始类型直接存储值,封装类存储对象引用。Integer提供了更多方法,如比较、转换等。在内存中,int是栈内存,Integer是堆内存。 4. **多线程表示**:多线程的两种创建方式是继承`Thread`类和实现`Runnable`接口。...

    Java软件开发实战 Java基础与案例开发详解 11-4 List接口实现类 共15页.pdf

    根据给定文件的信息,我们可以提炼出关于Java软件开发中List接口实现类的关键知识点。这部分内容主要聚焦于第11章的“Java集合框架和泛型机制”,特别关注List接口及其几种实现类,包括`ArrayList`、`LinkedList`、`...

    java-多文件上传dome

    在Java编程中,多文件...通过这个"java-多文件上传dome"工具包,你可以快速实现上述功能,无需从头编写所有代码。不过,记得在实际项目中,除了功能实现,还要关注性能、安全性和可维护性,确保应用程序的稳定运行。

    JAVA编程高级-工具类.pdf

    `Object`类是所有Java类的基类,也就是说所有的类都直接或间接地继承自`Object`。因此,`Object`类中定义的方法可以在所有类中使用。 - **Object类常用方法** - `public boolean equals(Object obj)`:比较两个...

    JAVA继承、抽象类、接口[汇编].pdf

    与某些其他语言不同,Java不支持一个类直接继承多个父类,但可以通过实现多个接口来达到类似的效果。这种设计避免了多继承可能导致的复杂性和不确定性。 总结来说,Java的继承、抽象类和接口是实现面向对象特性的...

    java-lib

    在Java编程中,库(Library)是预先编写好的代码集合,程序员可以导入并直接使用,无需从头开始编写所有功能。这些库通常以JAR(Java Archive)文件的形式存在,里面封装了类和方法,可供应用程序调用。Java库广泛...

    Java语言常用的方法名.doc

    - **定义**: 类方法(也称为静态方法)是在类级别定义的方法,可以直接通过类名调用,而不需要创建类的实例。 - **特点**: 静态方法不能访问类的实例变量。 - **用途**: 静态方法常用于实现与特定对象无关的功能,...

    基于Java的实例源码-调用本地库 JNAerator.zip

    JNAerator是JNA的一个辅助工具,它自动从头文件生成JNA的Java绑定,极大地简化了与本地库的交互过程。通过JNAerator,开发者可以避免手动编写复杂的JNI接口定义,从而将更多的精力集中在应用程序的业务逻辑上。 本...

    java-Swing外观包

    在"Swing外观包.jar"这个文件中,可能包含了一些预设的LookAndFeel实现或者定制的LookAndFeel类,以便开发者可以直接导入并应用于他们的项目中,无需从头开始编写。这大大简化了创建独特界面的过程,使得开发者可以...

    Java基础知识的详细总结

    反射是Java中的一个重要概念,它允许程序在运行时检查类的信息并调用其成员。 - **反射机制的作用**: - 动态获取类的信息。 - 创建对象和调用方法。 - 修改访问权限。 - **反射机制的使用**: - 通过`Class`...

    _Java-集合容器-2.List及其实现类.ppt

    List接口是Java集合框架中的核心接口之一,它继承自Collection接口,并具有特定的特性:元素可以重复,保持元素的顺序,并允许对元素的位置进行精确控制。List接口有多个实现类,包括ArrayList、LinkedList、Vector...

    获取天气预报API,免费接口,项目下载可运行,Java实现

    标题中的“获取天气预报API,免费接口,项目下载可运行,Java实现”表明这是一个关于使用Java语言开发的天气预报API项目,它提供了免费的API接口,并且已经打包为可直接运行的形式。这样的项目通常对开发者来说是很...

    aspose-words-java-23.6-jdk17.jar.zip

    在Java代码中,他们可以通过导入Aspose.Words相关的类和方法,开始执行文档处理任务。例如,下面是一个简单的例子,演示如何使用Aspose.Words读取和保存一个Word文档: ```java import com.aspose.words.Document; ...

    java api(2008-05-06中文版)

    Java API(Application Programming Interface)是Java编程语言的一部分,它提供了一系列预定义的类和接口,使开发人员能够执行常见的编程任务,如处理文件、执行数学运算、绘制图形用户界面等,而无需从头开始编写...

Global site tag (gtag.js) - Google Analytics